Fenvik daraxti va algoritmi
Fenvik daraxti va algoritmi 1. MUNDARIJA I. KIRISH ....................................................................................... 2 II. FENVIK DARAXTI VA ALGORITMI ................................................ 5 2.1 Fenvik daraxti haqida umumiy tushuncha ........................................................ 5 2.2 Fenvik daraxtining amaliyotda qo‘llanilishiga oid algoritmlar ...................... 10 2.2.1 Quyida Fenvik daraxtining ushbu vazifa uchun qo‘llash ........................................................... 10 2.2.2 Fenvik daraxti yordamida diapazon yig‘indisini hisoblash uchun dastur kodi ........................... 15 2.2.3 Fenvik daraxti yordamida eng katta ketma-ketlik muammosini maksimal darajada hal qilish vazifasi ............................................................................................................................................... 19 2.3 Fenvik daraxt strukturasini yaratish bo‘yicha umumiy ko‘rsatmalar ............ 22 III. XULOSA ................................................................................... 23 IV. FOYDALANILGAN ADABIYOTLAR: ............................................. 26 4.1 Ijtimoiy sahifalar va saytlarda mavjud adabiyotlar: ...................................... 26 1
KIRISH Dasturlashda daraxtlar kodni tuzishda bo‘lgan muammolar va xatolar yuzasidan yordam olish uchun ishlatiladi. Daraxtlar muhim funksiyalar va o‘zaro bog‘lanishni ta’minlash uchun yaratilgan hamda dastur kodi oson yozilishi uchun ishlatiladi. Hisoblashda ishlatiladigan daraxtlar grafik nazariyasidagi daraxtlarning matematik konstruksiyalariga o‘xshash, ammo farq qilishi mumkin, to‘plamlar nazariyasidagi daraxtlar va tavsiflovchi to‘plamlar nazariyasidagi daraxtlar. Daraxt ma’lumotlar tuzilishi - bu ma’lumotlarni joylashtirish va qidirish oson bo‘lgan tarzda ifodalash, hamda tartibga solish uchun ishlatiladigan ierarxik tuzilma. Bu qirralar bilan bog‘langan va tugunlar o‘rtasida ierarxik munosabatlarga ega bo‘lgan tugunlar to‘plamidir. Daraxtning eng yuqori tuguniga ildiz, uning ostidagi tugunlarga esa avlod tugunlari deyiladi. Ushbu ma’lumotlar tuzilishi kompyuterda ma’lumotlarni yanada samarali ishlatish uchun tartibga solish va saqlashning maxsus usuli hisoblanadi. U qirralar orqali bog‘langan markaziy tugun, strukturaviy tugunlar va pastki tugunlardan iborat. Shuni ham aytishimiz mumkinki, daraxt ma’lumotlari tuzilishi bir-biri bilan bog‘langan ildizlar, novdalar va barglarga ega. Har bir tugunda bir nechta avlod tugunlar bo‘lishi mumkin va bu avlod tugunlari ham o‘zlarining avlod tugunlariga ega bo‘lib, rekursiv tuzilmani hosil qiladi. Daraxtlar - bu dinamik to‘plam amallarni bajaradigan ma’lumotlar tuzilmalari. Bunday amallar sifatida elementni qidirish, minimal(maksimal) elementni qidirish, kiritish, o‘chirish, avlod-ajdodga o‘tish, avlodga o‘tish kabilarni keltirish mumkin. Shunday qilib, daraxt oddiy lug‘at sifatida ham, ustivor navbat sifatida ham ishlatilishi mumkin. Daraxtdagi ma’lumotlar ketma-ket saqlanmaydi, ya’ni ular chiziqli saqlanmaydi, balki ular bir necha darajalarda joylashtirilgan va biz buni iyerarxik tuzilma deb aytishimiz mumkin. Shu sababli, daraxt chiziqli bo‘lmagan ma’lumotlar tuzilishi deb hisoblanadi. Daraxt ma’lumotlar tuzilishiga extiyojlar: kompyuterdagi ma’lumotlar tuzilmasi(fayllar tizimi)ni qurilishida ma’lumotlar joylashuvi daraxtlar asosida 2
quriladi; kompilyator dizaynida dastur tuzilishini ifodalash uchun sintaksis daraxti ishlatiladi; B daraxtlari va boshqa daraxt tuzilmalari ma’lumotlar bazasini indekslashda ma’lumotlarni samarali qidirish va olish uchun ishlatiladi. Daraxt ma’lumotlar tuzilishining afvzalliklari: daraxtlar daraxt turiga qarab samarali qidirishni taklif qiladi, o‘rtacha qidirish vaqtlari O(log n) bo‘lib, ushbu usul AVL kabi muvozanatli daraxtlar uchundir; daraxtlar ma’lumotlarning ierarxik ko‘rinishini ta’minlaydi, bu esa katta hajmdagi ma’lumotlarni tartibga solish va boshqarishni osonlashtiradi; daraxtlarning rekursiv tabiati ularni rekursiv algoritmlar yordamida o‘tish va boshqarishni osonlashtiradi. Daraxt ma’lumotlar tuzilishining kamchiliklari: muvozanatsiz daraxtlar, ya’ni daraxtning balandligi bir tomonga qiyshaygan, bu esa qidiruv vaqtlarining samarasizligiga olib kelishi mumkin; daraxtlar massivlar va bog‘langan ro‘yxatlar kabi ba’zi boshqa ma’lumotlar tuzilmalariga qaraganda ko‘proq xotira maydonini talab qiladi, ayniqsa daraxt juda katta bo‘lsa; daraxtlarni amalga oshirish va manipulyatsiya qilish murakkab bo‘lishi mumkin va algoritmlarni yaxshi tushunishni talab qiladi. Fenvik daraxti daraxtlarning indekslangan turi bo‘lib, dasturlashda dasturchilarga kodni tuzishda yordam beradi va kodni tuzish va bajarishda xatoliklar kamayadi. Fenvik daraxti dasturchilarga kodni yozishda kerakli sintaksis va qoidalarni tushuntiradi va kodni to‘g‘ri yozishni osonlashtiradi. Bu qoidalarga amal qilish orqali, dasturchilar kodni to‘g‘ri yozishni osonlashtiradi va kodni tuzish va boshqa dasturlash vazifalarini bajarishda xatoliklar kamayadi. Fenvik daraxti Python dasturlash tilida ham qo‘llaniladi. Bu daraxt Python dasturlash tilida o‘zining sintaksisiga ega bo‘lib, dasturchilarga o‘zgaruvchan ma’lumotlar saqlash va ularga murojaat qilish imkoniyatini beradi. Fenvik daraxtining asosiy afvzalliklari quyidagilardan iborat: 3
o‘zgaruvchan va o‘zgarmas ma’lumotlar uchun xususiyatlarda; sintaksisda; yorqinligida; keng qo‘llanilishida; xavfsizligida; o‘ziga xos funksiyalarida; keng tarqalganligida; yangilanishlarni kuzatib borish juda ham qulay. Fenvik daraxtining asosiy kamchiliklari quyidagilardan iborat: tezlik; xotira sarflanishi; qiyinchilik; resurslar miqdorining cheklanganligi; o‘zgaruvchilardan foydalanishning noqulayligi. Dasturlashda Fenvik daraxtini o‘rganish juda ham zarur. Fenvik daraxti dasturlashda matematik masalalarni yechish, algoritmlar yaratish va ma’lumotlarni tahlil qilish uchun ishlatiladi. Shu tarzda, ishlab chiquvchilar muhim muammolarni hal qilishlari va dasturlarning yaxshiroq va samarali ishlashiga yordam berishlari mumkin. Fenvik daraxtida qo‘llaniluvchi o‘zgaruvchilar Fenvik o‘zgaruvchilar deb ataladi va Fenvik o‘zgaruvchilari dasturchilarga funksiya ichida aniqlanmagan va funksiyadan tashqarida aniqlangan o‘zgaruvchilarga kirishga imkon beradi. Bu dasturchilarga funksiyalar o‘rtasida ma’lumotlarni almashish va dasturning turli qismlari o‘rtasida ma’lumotlarni uzatish imkonini beradi. 4
FENVIK DARAXTI VA ALGORITMI 2.1 Fenvik daraxti haqida umumiy tushuncha Fenvik daraxti dasturlashda o‘zining o‘ziga xos xususiyatlari bilan ajratilgan. Bu xususiyatlar esa o‘zgaruvchan va o‘zgarmas bo‘lishi mumkin. Fenvik daraxti (ingliz tilidan olingan bo‘lib, “ikkilik indeksli daraxt” degan ma’noni anglatadi) – prefiks yig‘indisini samarali hisoblashi va elementlarni yangilashi mumkin bo‘lgan ma’lumotlar tuzilishi, saqlashni talab qiladigan ma’lumotlar tuzilishi O(n) o‘lchovli xotira va samarali hisoblangan quyidagi operatsiyalarni bajarish kabi bir qancha vazifalarni bajaradi: qatordagi istalgan elementning qiymatini osongina o‘zgartirish; [i, j] segmentdagi assotsiativ, komutativ, qiymat qaytaradigan operatsiyani bajarish(odatda bu yig‘indini hisoblovchi yig‘indi funksiyasi); Ikkilik daraxtning barglarida asl massivning qiymatlari, qolgan tugunlarida esa avlodlarning qiymatlari yig‘indisi saqlanadi. Fenvik daraxti yordamida har bir butun sonni ikki daraja yig‘indisi sifatida ifodalash mumkin. Xuddi shu tarzda, jami yig‘indini ushbu o‘zgaruvchan chastota to‘plamlari yig‘indisi sifatida hisoblash mumkin. Fenvik daraxtining strukturasi hamda unda yig‘indi funksiyasining qo‘llanilishi quyidagicha: vector<int> daraxt; int size; void increase(int index, int value) { for(int i=index; i<size; i = (i | (i+1))) daraxt[i] += value; } int sum(int right) 5