Fenvik daraxti
“ Fenvik daraxti MUNDARIJA: KIRISH …………………………………………………………………………… 3 1. Fenvik daraxti va uning ishlash prinsipi ……………………………………4 1.1. Operatsiya F …………………………………………………………………..5 1.2. Miqdorni hisoblash …………………………………………………………...6 1.3. Daraxt segmentlari bilan taqqoslash ..……………………………………… 7 2. Dasturlash tillarida amalga oshirish………… … …………………… ………12 2.1. C dasturlash tilida amalga oshirish………… … …………………… ……… 12 2.2. C ++ dasturlash tilida amalga oshirish ………… … ………………….. …… 15 2.3. Python dasturlash tilida amalga oshirish ……… … ………………….. …… 16 2.4. Java dasturlash tilida amalga oshirish ……… … ………………….. ……… 17 3. Fenvik daraxtiga vizual kirish … ………………………………… …………. 19 3.1. Fenvik Daraxti … …………………………………………..…… …………. 22 4. Fenvik daraxti / ikkilik indekslangan daraxtlar ……………………………28 4.1. Fenvik daraxtining asosiy g'oyasi. ………………………………………… 29 4.2. Fenvik daraxti va segment daraxtini taqqoslash …………………………34 XULOSA ... ……………………………………………………………………… 35 FOYDAL ANILGAN ADABIYOTLAR ..……………………………………… 36 1
EJ KIRISH Fenvik daraxti yoki ikkilik indekslangan daraxt (ingl. binary indexed tree) - ko'p vazifalarda segmentlar daraxtini almashtiradigan, lekin ayni paytda uch yoki to’rt baravar tezroq ishlaydigan, mumkin bo'lgan minimal xotira miqdorini (bir xil uzunlikdagi massiv bilan bir xil) egallaydigan ma'lumotlar tuzilishi tezroq yoziladi va katta o'lchamlarga osonroq umumlashtiriladi. Fenvik daraxti-amalga oshirish oson, tez ishlaydi, lekin nazariy jihatdan mutlaqo aniq bo'lmagan ma'lumotlar tuzilishi, bu sizga prefiksdagi summani topishga va o(logN) uchun alohida elementlarni o'zgartirishga imkon beradi. Xuddi shu murakkablikka qaramay, Fenvik daraxti segmentlar daraxtiga qaraganda ancha tezroq ishlaydi. Ushbu ma'ruzada Fenvik daraxtining aniq ishlash printsipi berilmaydi, faqat amalga oshirish va foydalanish usullari ko'rsatiladi. Fenvik daraxti segmentlar daraxtiga qaraganda bir marta kamroq xotirani doimiy ravishda egallaydi. Buning sababi shundaki, Fenvik daraxti faqat ba'zi elementlar uchun operatsiya qiymatini saqlaydi va segmentlar daraxti elementlarning o'zini va operatsiyaning qisman natijalarini pastki kesmalarda saqlaydi, shuning uchun u kamida ikki baravar ko'p xotirani oladi. Fenvik daraxtini amalga oshirish osonroq. Fenvik daraxti qurilayotgan segmentdagi operatsiya qaytarilishi kerak, ya'ni segmentdagi minimal (maksimal kabi) bu daraxtni segment daraxtidan farqli o'laroq hisoblash mumkin emas. Ammo agar biz prefiksda minimal miqdorni topishimiz kerak bo'lsa, unda Fenvik daraxti bu vazifani bajaradi. Bunday Fenvik daraxti massiv elementlarini kamaytirish 2
operatsiyasini qo'llab-quvvatlaydi. Daraxtdagi minimalni qayta hisoblash prefiksdagi minimum massivini yangilashdan ko'ra tezroq. 1.Fenvik daraxti va uning ishlash prinsipi Fenvik daraxti-bu ma'lumotlar tuzilishi, massivdagi daraxt, quyidagi xususiyatlarga ega: 1) O (log N) vaqtidagi har qanday [L; R] segmentidagi ba'zi qaytariladigan g operatsiyasining qiymatini hisoblash imkonini beradi; 2)har qanday elementning qiymatini O (log N) ga o'zgartirishga imkon beradi; 3) O (N) xotirani talab qiladi, aniqrog'i N elementlar qatori bilan bir xil; 4) Ko'p o'lchovli massivlar uchun osongina umumlashtiriladi. Fenvik daraxtining eng keng tarqalgan ishlatilishi segmentdagi yig'indini hisoblashdir, ya'ni funktsiya G (X1,..., Xk) = X1 + ... + Xk. Fenvik daraxti birinchi marta "a new data structure for cumulative frequency tables" (Peter M. Fenwick, 1994) maqolasi bilan tasvirlangan. Sum funktsiyasi a qatorining barcha elementlari bo'ylab harakatlanadigan joyga t qatori bo'ylab harakatlanib, iloji boricha segmentlar bo'ylab "sakrash" ni amalga oshiradi. Birinchidan, u [F(R); R] segmentidagi summaning qiymatini javobga qo'shadi, so'ngra [F(F(R)-1); F(R)-1] segmentidagi summani oladi va hokazo nolga yetguncha. Upd funktsiyasi teskari yo'nalishda - indekslarni ko'paytirish tomon siljiydi, TJ yig'indisi qiymatlarini faqat kerakli pozitsiyalar uchun yangilaydi, ya'ni f(j) <= i <= j bo'lgan barcha j uchun. shubhasiz, ikkala operatsiyaning tezligi F funktsiyasini tanlashga bog'liq bo'ladi. F(X) qiymatini quyidagicha aniqlaymiz: 3
F(X) = X & (X+1) (1) F(j) ni topish < = i < = j formulaga mos keladi: H(X) = X / (X+1) (2) 1.1. Operatsiya F. F operatsiyasini turli yo'llar bilan tanlash mumkin, lekin ko'pincha interval yig'indisi operatsiyalari, interval mahsuloti, shuningdek ma'lum bir modifikatsiya va cheklovlar, intervalda maksimal va minimalni topish yoki boshqa operatsiyalar olinadi. Eng oddiy vazifa Massivning ketma-ket elementlari yig'indisini topish muammosini ko'rib chiqing. Ko'p so'rovlar bo'lishini hisobga olsak, s (L, R) ni topishingiz kerak bo'lgan shakl (L,R)- a[L] dan a[R] gacha bo'lgan barcha elementlarning yig'indisi. Ushbu muammoning eng oddiy echimi qisman summalarni topish bo'ladi. Ularni topgandan so'ng, biz ushbu summalarni sum[i]=a[1]+a[2]...+a[i]. bo'lgan qatorga yozamiz...+ a[i]. Keyin so'rovda talab qilinadigan qiymat S(L,R)=sum[R]-sum[L-1] (sum[0] odatda alohida holatlarni hisobga olmaslik uchun nolga teng deb hisoblanadi). Kamchiliklari - ushbu vazifani amalga oshirishda muhim kamchiliklar mavjud. Va asosiylaridan biri shundaki, asl massivning bitta elementini o'zgartirganda, o'rtacha O(N) qisman summalarni qayta hisoblash kerak va bu vaqt talab etadi. Ushbu muammoni hal qilish uchun siz Fenvik daraxtidan foydalanishingiz mumkin. Afzalliklari - Ushbu dizaynning asosiy afzalligi-amalga oshirish qulayligi va so'rovlarga javoblarning tezligi O (1). Fenvik daraxtining ushbu vazifa uchun qo'llanilishi. Tabiiy sonlarda aniqlangan va x&(x+1) (&- bit va) ga teng bo'lgan g (x) funktsiyasini kiritamiz. Shunday qilib, g (x) x ga teng, agar x ning ikkilik kengayishida oxirgi 0 bo'lsa (x 2 ga bo'linadi). Va agar ikkilik kengayishda x kichik raqamlarda birliklar guruhi mavjud bo'lsa, unda funktsiya x ga teng bo'lib, oxirgi birliklar 0 ga almashtiriladi. Bu x & (x+1) ekanligiga misollar bilan ishonch hosil qilishingiz mumkin. 4
Endi biz quyidagi qisman summalarni hisoblaymiz va ularni t[i] = a[G[i]] + a[G[i]+1]…+ a[i] ga yozamiz. Keyinchalik, ushbu summalarni qanday topish mumkinligi ko'rsatiladi. 1.2. Miqdorni hisoblash. S(L,R) ni topish uchun s(1, L-1) va s(1,R) ni qidiramiz. Agar t qatori bo'lsa, s(L, R) ni topadigan funktsiyani yozamiz. Bunday holda, chap uchi summaga kiritilmaydi, lekin uni yoqish oson agar bu vazifada talab qilinsa (kodga qarang). const int N = 100; int t[N],a[N]; int sum(int L, int R) { int res=0; while (R >= 0) { res += t[R]; R = G( R ) - 1; } while (L >= 0) { res -= t[L]; L = G(L) - 1; } return res; } Shuni ham ta'kidlash kerakki, har bir dastur uchun g funktsiyasi x ikkilik yozuvidagi birliklar sonini kamida 1 ga kamaytiradi. Shundan kelib chiqadiki, summani hisoblash O (log N) uchun amalga oshiriladi. Elementlarni o'zgartirish. Endi elementlarning modifikatsiyasini ko'rib chiqing. Elementlarning qanday o'zgarishiga qarab qisman summalarni tezda 5