Brodala – Okasaki uyumi
![Brodala – Okasaki uyumi
MUNDARIJA:
KIRISH …………………………………………………………………………… 3
1. Brodal va Okasakining ustuvor navbati ………………………………………
5
1.1 Eng qiyin operatsiya deleteMin ………………………………………………
6
1.2. Brodalning ma'lumotlar
strukturasi ………………………………………...9
2. Ikkilamchi navbatlar ………… … …………………… … …… … …… ………
12
3. Global ildiz qo'shish … ……………………………… … ………… ………… 20
3.1. AddRoot optimallashtirish … ……………………………… … ………… ... 22
3.2. Bootstrapping ustuvor navbatlar … ……………………………… … ……24
3.3. Optimallashtirish … …… … …… … ……………………………… … ……..28
4. Tegishli ish va muhokama ……… … …… … …… … …………………………
30
4.1. Munozara ……… … …… …… …… …… ……… … …………………………
31
XULOSA ………………………………………………………………………....
34
FOYDALANILGAN ADABIYOTLAR ………………………………………
35
1](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_1.png)
![Kirish
Brodal Okasaki (ingl. Brodal's and Okasaki's Priority Queue)-kaskadli
havolalarsiz binomial qoziqdan foydalanish, minimal element qo'shish va
ma'lumotlar strukturasini yuklash g'oyasiga asoslangan. Birinchisi sizga imkon
beradi insert uchun O(1), ikkinchisi sizga minimal elementni olish imkonini
beradi O(1), uchinchisi esa bajarishga imkon beradi merge uchun O(1). Minimalni
olib tashlash quyidagilar uchun ishlaydi O(logN) eng yomon holatda. Ushbu hisob-
kitoblar taqqoslashga asoslangan barcha ustuvor navbatlar orasida asimptotik
jihatdan maqbuldir.
Bu chegaralar asimptotikdir barcha taqqoslashga asoslangan ustuvor
navbatlar orasida optimal. Brodalning ma'lumotlar strukturasi sof funktsional
sozlamalarga ega. Bunda Vuillemin ma'lumotlar strukturasini soddalashtirish va
uning binomial navbatlar bilan aloqasini aniqlashtirish O(log n) vaqtida barcha
to'rtta operatsiyani qo'llab-quvvatlaydi. Xususan, biz amalga oshirishni binomial
navbatlardan uch bosqichda olamiz: birinchidan, biz kaskadli havolalar
imkoniyatidan foydalanib, qo'shimchaning ishlash vaqtini O(1) ga qisqartiramiz;
ikkinchidan, minimal elementni ushlab turish uchun global ildiz qo'shish orqali
findMin ning ishlash vaqtini O(1) ga qisqartiramiz; va nihoyat, ustuvor navbatlar
boshqasini o'z ichiga olishiga ruxsat berish orqali qotishning ishlash vaqti O(1) ga
kamaytiramiz. Ushbu bosqichlarning har biri ML uslubidagi funktorlar yordamida
ifodalanadi. Ma'lumotlar-strukturali yuklash deb nomlanuvchi so'nggi
2](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_2.png)
![transformatsiya qiziqarli yuqori tartibli funktorlar va rekursiv tuzilmalarni
qo'llashdir.
Sof funktsional ma'lumotlar tuzilmalari imperativ ma'lumotlar
tuzilmalaridan kamida ikki jihatdan farq qiladi. Birinchidan, ko'plab imperativ
ma'lumotlar tuzilmalari samaradorlik uchun halokatli topshiriqlarga tayanadi,
holbuki sof funktsional ma'lumotlar tuzilmalariga halokatli topshiriqlardan
foydalanish taqiqlanadi. Ikkinchidan, sof funktsional ma'lumotlar tuzilmalari
avtomatik ravishda
doimiy ya'ni yangilanishdan keyin ikkalasi ham ma'lumotlar strukturasining yangi
va eski versiyalari keyingi ma'lumotlar uchun mavjud kirish va yangilanishlardir.
Bundan farqli o'laroq, imperativ ma'lumotlar tuzilmalari deyarli har doim
vaqtinchalik bo'ladi, ya'ni yangilanishdan keyin faqat yangi ma'lumotlar strukturasi
versiyasi mavjud. Ko'pgina hollarda, algoritm matnlarida tasvirlanganlar kabi
ma'lumotlar tuzilmalari funktsional dasturchilarga oddiygina foydalanishga
to'sqinlik qiladi. Shunday qilib, samarali sof funktsional ma'lumotlar tuzilmalarini
loyihalash katta ahamiyatga ega. Funktsional dasturchilar uchun nazariy va amaliy
qiziqish, shuningdek doimiy bo'lgan holatlar uchun imperativ dasturchilarga kelsak
ma'lumotlar tuzilishi talab qilinadi.
Ustuvor navbat kompyuter dasturlashda asosiy abstraksiyadir, faqat lug'at
orqali muhimligi oshib ketgan ketma-ketlik. Ustuvor navbatlarning ko'plab
tatbiqlari amalga oshirilishi yillar davomida taklif qilingan, kichik namuna :
(Williams, 1964; Kran, 1972; Vuillemin, 1978; Fredman va Tarjan, 1987; Brodal,
1996). Biroq, bularning barchasi faqat imperativ ustuvor navbatlarni hisobga oladi.
Juda sof funktsional ustuvor navbatlar haqida kam yozilgan. Bizning bilim, faqat
Paulson (1991), Kaldewaij va Schoenmakers (1991), Schoenmakers (1992) va
King (1994) ustuvorliklarga aniq munosabatda bo'lishdi.
3](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_3.png)
![1. Brodal va Okasakining ustuvor navbati
Binomli navbatlar ustuvor navbatning nafis shaklidir. Vuillemin (1978) va
Braun (1978) tomonidan keng o'rganilgan. Garchi ular binomial navbatlarni faqat
imperativ sharoitda ko'rib chiqqan bo’lsalar ham, King (1994) binomial navbatlar
funktsional sharoitda teng darajada yaxshi ishlashini ko'rsatdi. Ushbu bo'limda biz
binomial navbatlarni qisqacha ko'rib chiqamiz .
Binomli navbatlar ibtidoiy deb nomlanuvchi ob'ektlardan iborat binomial daraxtlar.
Binom daraxtlari induktiv ravishda quyidagicha aniqlanadi:
• 0-darajali binom daraxti yagona tugundir.
• r+1 darajali binom daraxti ikkita binomni bog‘lash orqali hosil bo‘ladi.
r-darajali daraxtlar, bir daraxtni ikkinchisining eng chap bolasi qilib oladi. Ushbu
ta'rifdan r darajali binomial daraxt ekanligini ko'rish oson aniq 2r tugunni o'z
ichiga oladi. Ikkinchi, ekvivalent ta'rifi. Ba'zan qulayroq bo'lgan binomial
daraxtlar: binomial daraxt r rank - r bolalar t1 ...tr bo'lgan tugun, bu erda har bir ti
binomdir
r - i darajali daraxt.
Tugunlar bo'yicha umumiy tartibni nazarda tutsak, binomial daraxt deyiladi
har bir tugun ≤ har bir avlodi bo'lsa, yig'ma tartibli. Saqlash uchun Ikki uyin tartibli
daraxtlarni bog'lashda yig'ish tartibini qilamiz ildizi kattaroq daraxt - kichikroq
ildizli daraxtning bolasi, bilan aloqalar o'zboshimchalik bilan uziladi.
4](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_4.png)
![Bir binomial binomial navbat, bu erda yig'ilgan tartibli binomial daraxtlar
o'rmonidir ikkita daraxt bir xil darajaga ega emas. Chunki binomial daraxtlarning
o'lchamlari bor
2 r
shakldagi, n o'lchamdagi binomial navbatdagi daraxtlarning
qatorlari
ning ikkilik ko'rinishidagilarga ko'ra taqsimlanadi. Masalan, 21 o'lchamdagi
binomial navbatni ko'rib chiqing. Binar 21 ning ifodasi 10101 va binomial
navbatda daraxtlar mavjud 0, 2 va 4-darajali (mos ravishda 1, 4 va 16
o'lchamdagi). E'tibor bering, a n o lchamdagi binomial navbat ko pi bilanʻ ʻ
log2(n+1) daraxtini o z ichiga oladi. Endi biz binomial navbatlardagi
ʻ
operatsiyalarni tasvirlashga tayyormiz. Binomial navbatdagi barcha daraxtlar
yig'indisi bo'lganligi sababli, biz buni bilamiz
binomial navbatdagi minimal element birining ildizi daraxtlardir. Ushbu minimal
elementni O(log n) vaqtida skanerlash orqali topishimiz mumkin ildizlar orqali.
Navbatga yangi element qo'shish uchun birinchi navbatda yangi singleton daraxtini
yarating (ya'ni, 0-darajali binomial daraxt). Biz keyin bizgacha martabani oshirish
tartibida mavjud daraxtlar orqali qadam yo'qolgan darajani toping, biz borar
ekanmiz, teng darajadagi daraxtlarni bog'laymiz. Kiritish elementni binomial
navbatga qo'shish bittani qo'shishga to'g'ri keladi ikkilik raqam, har bir havola
tashishga mos keladi. Eng yomon hol bu n = 2k − 1 o lchamdagi navbatga kiritish
ʻ
bo lib, jami k ni havolalar va O(log n) vaqti talab qiladi. ikkita navbatni
ʻ
birlashtirish uchun ikkilik qo'shishga o'xshashlik ham amal qiladi. Biz ikkala
navbatning daraxtlari orasidan o'tamiz. Bir marta yana, har bir havola bir tashish
mos keladi. Buning uchun O (log n) vaqtni ham talab qiladi.
1.1. Eng qiyin operatsiya bu deleteMin . Biz birinchi navbatda daraxtni
topamiz minimal ildiz va uni navbatdan olib tashlaymiz. Biz ildizni olib
tashlaymiz, lekin keyin o'z farzandlarini navbatga qaytarishi kerak. Biroq, bolalar
o'zlari to'g'ri binomial navbatni tashkil qiladi (ya'ni, bir xil darajadagi ikkita daraxt
bo'lmagan tepalikli binomial daraxtlar o'rmoni) va shuning uchun navbatning
qolgan daraxtlari bilan birlashtirilishi mumkin. Ikkala topilma daraxtni olib
5](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_5.png)
![tashlash va bolalarni navbatga qaytarish O(log n) vaqt, jami O(log n) vaqt talab
etadi. Elementlar va belgilangan turdagi elementlarni o'z ichiga olgan ustuvor
navbatlar tuzilishini ishlab chiqaradi. Ushbu amalga oshirishning ikkita jihati
qo'shimcha tushuntirishga loyiqdir. Birinchidan, qo'shimchaning qarama-qarshi
talablari va bog'lanish deyarli barcha uchun umumiy bo'lgan chalkash
nomuvofiqlikka olib keladi functor Binomial Queue (E: ORDERED):
PRORITALIK NAVBAT =
struct
structure Elem = E
type Rank = int
datatype Tree = Node of Elem.T × Rank × Tree list
type T = Tree list
( ∗ auxiliary functions ∗ )
fun root (Node (x,r,c)) = x
fun rank (Node (x,r,c)) = r
fun link (t1 as Node (x1,r1,c1), t2 as Node (x2,r2,c2)) = ( ∗ r1 = r2 ∗ )
if Elem.leq (x1, x2) then Node (x1,r1+1,t2 :: c1) else Node (x2,r2+1,t1 :: c2)
fun ins (t, [ ]) = [t]
| ins (t, t0 :: ts)= ( ∗ rank t ≤ rank t0 ∗ )
if rank t < rank t
0 then t :: t0 :: ts else ins (link (t, t0), ts)
val empty =[]
fun isEmpty ts = null ts
fun insert (x, ts) = ins (Node (x,0,[ ]), ts)
fun meld ([ ], ts) = ts
| meld (ts, [ ]) = ts
| meld (t1 :: ts1, t2 :: ts2) =
if rank t1 < rank t2 then t1 :: meld (ts1, t2 :: ts2)
else if rank t2 < rank t1 then t2 :: meld (t1 :: ts1, ts2)
6](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_6.png)
![else ins (link (t1, t2), meld (ts1, ts2))
exception EMPTY
fun findMin [ ] = raise EMPTY
| findMin [t] = root t
| findMin (t :: ts) = let val x = findMin ts
in if Elem.leq (root t, x) then root t else x end
fun deleteMin [ ] = raise EMPTY
| deleteMin ts =
let fun getMin [t]=(t, [ ])
| getMin (t :: ts) = let val (t0, ts0) =
getMin ts in if Elem.leq (root t, root t0)
then (t, ts) else (t0, t :: ts0) end
val (Node (x,r,c), ts) = getMin ts
in meld (rev c, ts) end
end
Bu - binomial navbatlarni amalga oshiruvchi funktordir. Binomial
navbatlarning qo'shimchalari. Binomial navbatdagi daraxtlar qo'shish
operatsiyasini samarali qo'llab-quvvatlash uchun darajani oshirish tartibida
saqlanadi. Boshqa tomondan, binomial daraxtlarning bolalari havola ishini qo'llab-
quvvatlash uchun darajaning pasayish tartibida samarali saqlanadi. Bu
nomuvofiqlik bizni DeleteMin paytida o'chirilgan tugun bolalarni o'zgartirishga
majbur qiladi. Ikkinchidan, aniqlik uchun, har bir tugun o'z darajasini o'z ichiga
oladi. Haqiqiy amalga oshirishda esa, faqat ildizlar saflarini saqlab qolar edi.
Boshqa barcha tugunlarning darajalari o'ziga xosdir ota-onalarining martabalari va
o'rtasidagi o'rinlari bilan belgilanadi ularning ukalari. King (1994) muqobil
vakillikni tasvirlaydi ular uchun to'ldiruvchilarni joriy etish evaziga barcha
darajalarni yo'q qiladi. Ularning ikkilik ko'rinishidagi nolga mos keladigan
darajalar navbatning o'lchami.
7](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_7.png)
![Biz quyidagi operatsiyalarni qo'llab-quvvatlaydigan ustuvor navbatlarni
ko'rib chiqamiz:
findMin (q) q navbatining minimal elementini qaytaring.
insert (x, q) X elementini q navbatiga kiriting.
meld (q1, q2) q1 va q2 navbatlarini bitta navbatga birlashtiring.
deleteMin (q) q navbatining minimal elementidan voz keching.
Bundan tashqari, ustuvor navbatlar bo'sh qiymatni ifodalovchi bo'sh qiymatni
beradi
signature ORDERED =
sig
type T ( ∗ type of ordered elements ∗ )
val leq : T × T → bool ( ∗ total ordering relation ∗ )
end
signature PRIORITY QUEUE =
sig
structure Elem : ORDERED
type T ( ∗ type of priority queues ∗ )
val empty : T
val isEmpty : T → bool
val insert : Elem.T × T → T
val meld : T × T → T
exception EMPTY
val findMin : T → Elem.T ( ∗ raises EMPTY if queue is empty ∗ )
val deleteMin : T → T ( ∗ raises EMPTY if queue is empty ∗ )
end
navbat va predikat bo'sh. Oddiylik uchun biz bo'sh narsalarni e'tiborsiz qoldiramiz
8](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_8.png)
![haqiqiy kodni taqdim etishdan tashqari navbatlar. Ushbu ustuvor navbatlar uchun
standart ML imzosi ko'rsatilgan. Brodal (1995) yaqinda O (1) eng yomon holatdan
tashqari barcha bu operatsiyalarni qo'llab-quvvatlash uchun birinchi imperativ
ma'lumotlar strukturasini taqdim etdi. DeleteMin, bu O(log n) eng yomon vaqtni
talab qiladi. Bir necha oldingi ilovalar, ayniqsa Fibonachchi to'plamlari (Fredman
va Tarjan, 1987), bu chegaralarga erishgan edi, lekin amortizatsiya qilingan,
aksincha eng yomoni, ma'nosi. Bularni saralashni qisqartirish orqali ko'rsatish oson
chegaralar barcha taqqoslashga asoslangan ustuvor navbatlar orasida asimptotik
jihatdan optimaldir - deleteMin-dagi chegarani bu holda kamaytirish mumkin
emas.
findMin, insert va/yoki birlashmadagi chegaralarni bir vaqtning o'zida oshirish.
1.2. Brodalning ma'lumotlar strukturasini moslashtirish juda oddiy
rekursiv-sekinlashuvni birlashtirib, sof funksional sozlamaga Kaplan va Tarjan
(1995) texnikasi ikki tomonlama navbatlarning sof funktsional amalga oshirilishi
(Hud, 1982; Okasaki, 1995c).
Biroq, bu yondashuv kamida ikkita nuqsondan aziyat chekadi, biri amaliy
va bitta pedagogik. Birinchidan, ham rekursiv sekinlashuv, ham ikki tomonlama
navbatlar ahamiyatsiz bo'lmagan qo'shimcha xarajatlarni o'z ichiga oladi, shuning
uchun natijada ma'lumotlar tuzilishi amalda juda sekin (asimptotik optimal bo'lsa
ham). Ikkinchi, olingan dizaynni tushuntirish va tushunish qiyin. Dizayn tanlovlari
bir-biriga aralashib ketgan va maqsadni ko'rish qiyin har birining hissasi. Bundan
tashqari, boshqa ustuvorlik bilan munosabat navbat dizaynlari xiralashgan. Shu
ma'lumotlar tuzilishi sabablarga ko'ra biz Brodalni moslashtirishga bilvosita
yondashamiz. Birinchidan, biz Brodal ma'lumotlaridagi dizayn tanlovlarini
ajratamiz va har birini imperativ emas, balki funktsional muhitda qayta ko'rib
chiqing. Bu bizga rekursiv sekinlashuvni oddiyroq bilan almashtirishga imkon
beradi. Okasakining tasodifiy kirish ro'yxatidan olingan texnika (1995b) va ikki
tomonlama navbatlarga bo'lgan ehtiyojni butunlay yo'q qilish. Keyin,
Vuilleminning (1978) binomial navbati - taniqli oldingi narsadan boshlab, biz har
9](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_9.png)
![bir modifikatsiyani birma-bir qayta kiritamiz. Bu ham ma'lumotlar strukturasini
soddalashtiradi, ham uning boshqalar bilan aloqasini aniqlaydi ustuvor navbat
dizaynlari.
Biz binomial navbatlarni ko'rib chiqishdan boshlaymiz, ular O (log n)
vaqtida barcha to'rtta asosiy operatsiyalarni qo'llab-quvvatlaydi. Keyin biz
ma'lumotlar tuzilmamizni olamiz. Binomial navbatlardan uch bosqichda.
Birinchidan, biz yugurish tezligini kamaytiradigan egilgan binomial navbatlar deb
ataladigan binomial navbatni tasvirlaymiz. Kaskadli ulanishlar imkoniyatini yo'q
qilish orqali O (1) ga qo'shish vaqti. Ikkinchidan, a qo'shish orqali findMinning
ishlash vaqtini O(1) ga qisqartiramiz minimal elementni ushlab turish uchun global
ildiz. Uchinchidan, biz Buchsbaum va boshqalarning texnikasini qo'llaymiz.
(Buchsbaum va boshq., 1995; Buchsbaum & Tarjan, 1995) ma'lumotlarning
strukturaviy yuklash deb nomlanadi, bu esa ma'lumotlarni kamaytiradi ustuvor
navbatlarni o'z ichiga olishiga ruxsat berish orqali O(1) ga qotishning ishlash vaqti
boshqa ustuvor navbatlar. Ushbu bosqichlarning har biri ML funktorlar uslubi
yordamida ifodalanadi. Oxirgi transformatsiya, ma'lumotlarning strukturaviy
yuklanishi yuqori tartibli funktorlar va rekursiv tuzilmalarning qiziqarli
qo'llanilishi. Bir nechta mumkin bo'lgan optimallashtirishlarni tavsiflab bo'lgach,
biz xulosa qilamiz tegishli ishlar va kelajakdagi ishlar haqida qisqacha
muhokamalar.
1 - rasm: 0-3 darajali binom daraxtlari
10](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_10.png)
![2. Ikkilamchi navbatlar
Binomial navbatlarning skew deb ataladigan variantini tasvirlaymiz.
Binomial navbatlar, bu O (1) eng yomon vaqt vaqtida kiritishni qo'llab-
quvvatlaydi. Binomial navbatlar bilan bog'liq muammo bitta elementni a ga
kiritishdir navbat ulanishlarning uzun kaskadiga olib kelishi mumkin, xuddi a ga
bitta qo'shish kabi ikkilik raqam tashishlarning uzoq kaskadiga olib kelishi
mumkin. Biz kamaytirishimiz mumkin texnikani qarzga olish orqali ko'pi bilan
bitta havolaga qo'shish narxi tasodifiy kirish ro'yxatidan (Okasaki, 1995b).
Tasodifiy kirish ro'yxatlari qiyshiq ikkilik sonlar deb ataladigan variantli sanoq
sistemasiga asoslangan (Myers, 1983), bunda bitta qo'shish ko'pi bilan bitta
tashishga olib keladi.
Egri ikkilik sonlarda k-raqam 2k+1−¿ 1 ni ifodalaydi, aksincha oddiy ikkilik
sonlardagi kabi 2 k
dan ortiq. Har bir raqam nol teng bitta, bundan tashqari eng past
11](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_11.png)
![noldan farqli raqam ikkita bo'lishi mumkin. Masalan; misol uchun, 92 - 002101
deb yoziladi (birinchi eng kichik raqam). Tashish qachon sodir bo'ladi nolga teng
bo'lmagan eng kichik raqami ikkita bo'lgan songa bitta qo'shish. Misol uchun, 1 +
002101 = 000201. Keyingi yuqori raqam ikkita bo'lmasligi kafolatlanganligi
sababli, faqat bitta tashish kerak. Binamial navbatlar binomial daraxtlardan tashkil
topgani kabi, qiyshiq binomial navbatlar ham qiyshiq binomial daraxtlardan iborat.
Egri binomial daraxtlar induktiv ravishda quyidagicha aniqlanadi:
• 0-darajali qiyshaygan binomial daraxt yagona tugundir.
2 - rasm. Binomilal daraxtni qurishning 3 xil uslubi.
Egri binomial daraxtni qurishning uchta usuli daraja r + 1. (a) oddiy havola. (b) A
tipidagi egilgan havola. (c) a turidagi B qiyshiq l.
• r + 1 darajali qiyshiq binomial daraxt uchta usuldan birida hosil bo'ladi:
– oddiy havola, r-darajali qiyshiq binomial daraxtni eng chapga aylantiradi r
darajali boshqa qiyshiq binom daraxtining bolasi;
– r-darajali ikkita qiyshaygan binomial daraxtni hosil qiluvchi A tipidagi
egilgan bog‘lanish 0-darajali qiyshiq binomial daraxtning bolalari; yoki
– 0 va darajali qiyshaygan binomial daraxtni hosil qiluvchi B tipidagi egilgan
havola darajali qiyshiq binomial daraxt r boshqasining eng chap bolalarining
qiyshiq binomial daraxti
12](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_12.png)
![2 - rasmda uch xil havolalar ko'rsatilgan. E'tibor bering, A turi va r = 0 bo‘lganda
B tipidagi qiyshiq bog‘lanishlar ekvivalent bo‘ladi. Oddiy binomial daraxtlar va
mukammal muvozanatli binar daraxtlar qiyshiq binomialning maxsus holatlaridir
faqat oddiy havolalar va A tipidagi egri havolalarga ruxsat berish orqali olingan
daraxtlar, mos ravishda. r-darajali qiyshiq binom daraxti butunlay qurilgan Skew
links (turi A yoki B tipi) aniq 2 r+1
- 1 tugunni o'z ichiga oladi, lekin, umuman
olganda, r-darajali t qiyshiq binomial daraxtning o'lchami bilan chegaralanadi
2r ≤ |t| ≤ 2r+1 − 1. Bundan tashqari, qiyshiq binomial daraxtning balandligi
darajasiga teng. Yana bir bor, ikkinchi, ekvivalent ta'rif mavjud:
r > 0 darajali qiyshiq binomial daraxt - 2 minggacha bolali tugun
s
1 t
1 ... s
k t
k (1 ≤ k ≤ r), bunda har bir t
i darajali qiyshiq binomial daraxtdir. r - i va
har bir s
i 0-darajali qiyshiq binomial daraxtdir, bundan tashqari s
k ga ega r − k
darajasi (faqat k = r bo'lganda 0 bo'ladi). Bundan tashqari, har bir s
i ixtiyoriy bu s
i
faqat k = r bo'lganda ixtiyoriydir. Biroz chalkash bo'lsa-da, bu ta'rif tabiiy ravishda
a daraxtni qurishning uchta usulidan kelib chiqadi.
Har bir s
k t
k juftligi A tipidagi egilish havolasi orqali ishlab chiqariladi va
13](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_13.png)
![3 – rasm. 2-darajali qiyshiq binomial daraxtlarning o'n ikkita mumkin bo'lgan
shakllari.
Chiziqli qutilar har bir siti juftini o'rab oladi. Si ti juftligi (i<k) B tipidagi egilish
havolasi orqali ishlab chiqariladi. Har bir ti holda mos keladigan si oddiy havola
orqali ishlab chiqariladi. Oddiy binomial daraxtlardan farqli o'laroq, egilgan
binomial daraxtlar juda ko'p turli xil shakllarga ega bo'lishi mumkin. Masalan, 3-
darajali qiyshiq binomial daraxtlarning o'n ikkita mumkin bo'lgan shakllari
3 - rasmda ko'rsatilgan. Egri binomial daraxt, agar har bir tugun ≤ o'zining har biri
avlodlari bo'lsa, yig'ma tartibli hisoblanadi. Oddiy havola paytida yig'ish tartibini
saqlab qolish uchun biz ildizi kattaroq daraxt kichikroq ildizli daraxtning bolasi
qilamiz. Egri bog'lanish paytida biz ikkita daraxtni eng kichik ildizga ega bo'lgan
daraxtning kattaroq ildizli bolalar qilamiz. Agar A tipidagi egilish havolasini
bajaramiz 0-darajali daraxt eng kichik ildizga ega va agar ulardan biri bo'lsa, B
tipidagi egilgan havola r-darajali daraxtlar eng kichik ildizga ega. Egri binomial
14](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_14.png)
![navbat - yig'ma tartibli qiyshiq binomial o'rmonidir. Ikkita daraxt bir xil darajaga
ega bo'lmagan daraxtlar, ehtimol ikkitadan tashqari eng kichik o'rinli daraxtlar. Bir
xil darajadagi egilgan binomial daraxtlar bo'lishi mumkin turli o'lchamlarga ega,
darajalarni taqsimlashning bir necha yo'li bo'lishi mumkin har qanday o'lchamdagi
navbat uchun. Masalan, qiyshiq binomial navbat 4-o'lchamdagi bitta 2-darajali 4-
o'lchamdagi daraxtni o'z ichiga olishi mumkin; 1-darajali ikkita daraxt, har biri 2
o'lchamli; 3-o lchamdagi 1-darajali daraxt va 0-darajali daraxt; yoki 1-darajaliʻ
daraxt 2 o'lchamli va ikkita 0-darajali daraxtlar. Biroq, daraxtlarning maksimal
soni
navbatda hali ham O (log n).
Endi biz skew binomial navbatlar ustidagi amallarni tasvirlashga tayyormiz.
FindMin va birlashtirish operatsiyalari deyarli o'zgarmadi. Kimga qiyshiq binomial
navbatdagi minimal elementni toping, biz shunchaki skanerlaymiz ildizlar orqali,
O(log n) vaqtini oladi. Ikki navbatni birlashtirish uchun biz qadam qo'yamiz.
Ikkala navbatning daraxtlari bo'ylab ortib borayotgan darajalar tartibida, har doim
teng bo'lgan ikkita daraxt topilganda oddiy bog'lanishni (qiyshaygan havola emas!)
bajaramiz. Yana bir bor, bu O (log n) vaqtini talab qiladi. Oddiy binomialga
nisbatan qiyshiq binomial navbatlarning katta afzalligi navbatlar shundan iboratki,
biz endi O (1) vaqtida yangi elementni kiritishimiz mumkin. Biz birinchi yangi
singleton daraxtini yarating (ya'ni, 0-darajali egilgan binomial daraxt). Biz keyin
navbatdagi ikkita eng kichik daraxtning saflarini tekshiring. Agar ikkalasi ham
daraxtlar r darajasiga ega, keyin biz bu ikki daraxtni yangi daraja bilan bog'laymiz.
Yangi darajali r+1 daraxtini olish uchun 0 daraxti. Biz bilamizki, bundan ortiq
bo'lishi mumkin emas mavjud bir darajali r + 1 daraxtdan ko'ra, va bu eng kichik
darajadir
yangi navbatda, shuning uchun biz oddiygina yangi daraxtni navbatga qo'shamiz.
Agar navbatdagi ikkita eng kichik daraxt turli darajalarga ega, keyin biz oddiygina
15](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_15.png)
![navbatga yangi 0-darajali daraxt qo'shing. Chunki ko'pi bilan bittasi bor edi 0-
darajali mavjud daraxt, yangi navbat ko'pi bilan ikkita daraxtni o'z ichiga oladi eng
kichik daraja. Ikkala holatda ham, biz tugatdik.
Shunga qaramay, deleteMin eng murakkab operatsiya hisoblanadi. Avval
topamiz va daraxtni minimal ildiz bilan olib tashlang. Ildizni tashlaganingizdan
so'ng, biz uning bolalarini ikki guruhga ajratamiz, 0 darajali va o'sha rank > 0
bilan. S
k va t
k dan boshqa har bir si 0 va har bir darajaga ega ti darajasi > 0 ga ega.
k = r va S
k va t
k darajalari ikkalasi ham 0 ga teng. k<r bo'lganda ikkalasi > 0.
E'tibor bering, har bir 0-darajali bola bittadan iborat element. Darajasi > 0 bo lganʻ
bolalar to g ri qiyshiq binomni tashkil qiladi. Navbat, shuning uchun biz bu
ʻ ʻ
bolalarni navbatdagi qolgan daraxtlar bilan birlashtiramiz. Nihoyat, biz 0-darajali
bolalarning har birini qayta kiritamiz. Ushbu qadamlarning har biri O(log n) vaqtni
talab qiladi, shuning uchun talab qilinadigan umumiy vaqt O(log n) dir. Binomli
navbat funktori singari, bu funktor tartiblangan elementlarning turini ko'rsatuvchi
tuzilmani oladi va hosil qiladi. Belgilangan turdagi elementlarni o'z ichiga olgan
ustuvor navbatlar tuzilishi.
Yana bir bor, daraxtlar ro'yxati turli xil tartibda saqlanadi. Navbatdagi
daraxtlar ortib borayotgan tartibda saqlanadi daraja (birinchi ikkita daraxt bir xil
darajaga ega bo'lishidan tashqari), lekin
qiyshaygan binomial daraxtlarning bolalari yanada murakkab holatda saqlanadi :
functor SkewBinomialQueue (E : ORDERED) : PRIORITY QUEUE =
struct
structure Elem = E
type Rank = int
datatype Tree = Node of Elem.T × Rank × Tree list
type T = Tree list
( ∗ auxiliary functions ∗ )
fun root (Node (x,r,c)) = x
16](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_16.png)
![fun rank (Node (x,r,c)) = r
fun link (t1 as Node (x1,r1,c1), t2 as Node (x2,r2,c2)) = ( ∗ r1 = r2 ∗ )
if Elem.leq (x1,x2) then Node (x1,r1+1,t2 :: c1) else Node (x2,r2+1,t1 :: c2)
fun skewLink (t0 as Node (x0,r0, ), t1 as Node (x1,r1,c1), t2 as Node (x2,r2,c2)) =
if Elem.leq (x1,x0) andalso Elem.leq (x1,x2) then Node (x1,r1+1,t0 :: t2 :: c1)
else if Elem.leq (x2,x0) andalso Elem.leq (x2,x1) then Node (x2,r2+1,t0 :: t1 :: c2)
else Node (x0,r1+1,[t1, t2])
fun ins (t, [ ]) = [t]
| ins (t, t0 :: ts)= ( ∗ rank t ≤ rank t0 ∗ )
if rank t < rank t
0 then t :: t0 :: ts else ins (link (t, t0), ts)
fun uniqify []=[]
| uniqify (t :: ts) = ins (t, ts) ( ∗ eliminate initial duplicate ∗ )
fun meldUniq ([ ], ts) = ts
| meldUniq (ts, [ ]) = ts
| meldUniq (t1 :: ts1, t2 :: ts2) =
if rank t1 < rank t2 then t1 :: meldUniq (ts1, t2 :: ts2)
else if rank t2 < rank t1 then t2 :: meldUniq (t1 :: ts1, ts2)
else ins (link (t1, t2), meldUniq (ts1, ts2))
val empty =[]
fun isEmpty ts = null ts
fun insert (x, ts as t1 :: t2 :: rest) =
if rank t1 = rank t2 then skewLink (Node (x,0,[ ]),t1,t2) :: rest
else Node (x,0,[ ]) :: ts
| insert (x, ts) = Node (x,0,[ ]) :: ts
fun meld (ts, ts0
) = meldUniq (uniqify ts, uniqify ts0
)
exception EMPTY
17](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_17.png)
![fun findMin [ ] = raise EMPTY
| findMin [t] = root t
| findMin (t :: ts) =
let val x = findMin ts
in if Elem.leq (root t, x) then root t else x end
fun deleteMin [ ] = raise EMPTY
| deleteMin ts =
let fun getMin [t]=(t, [ ])
| getMin (t :: ts) =
let val (t0, ts0) =
getMin ts
in if Elem.leq (root t, root t0) then (t, ts) else (t0, t :: ts0) end
fun split (ts,xs,[ ]) = (ts, xs)
| split (ts,xs,t :: c) =
if rank t = 0 then split (ts,root t :: xs,c) else split (t :: ts,xs,c)
val (Node (x,r,c), ts) = getMin ts
val (ts0, xs0) = split ([ ],[ ],c)
in fold insert xs0 (meld (ts, ts0)) end
end
T
i bolalar darajasining kamayishi tartibida saqlanadi, lekin ular 0 darajasiga
ega bo'lgan s
i bolalari bilan aralashtiriladi (bundan tashqari r - k darajasiga ega
bo'lgan s
k ). Bundan tashqari, har bir s
i ixtiyoriy ekanligini unutmang (bundan
tashqari, s
k faqat k = r bo'lganda ixtiyoriydir).
Keyinchalik biz ustuvorlik bo'yicha modul darajasidagi oddiy
transformatsiyani tasvirlaymiz. FindMin ning ishlash vaqtini O(1) ga qisqartirish
uchun navbatlar. Garchi bu transformatsiya har qanday ustuvor navbat moduliga
qo'llanilishi mumkin, bu faqat findMin O(1) dan ko'proq narsani talab qiladigan
ustuvor navbatlarda foydalidir.
18](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_18.png)
![Ko'pgina ustuvor navbatlar navbatni bitta sifatida ifodalaydi minimal
element har doim topilishi uchun yig'ilgan tartibli daraxt O (1) vaqtida ildizda.
Afsuski, binomial navbatlar va egilish binomial navbatlar navbatni to'plangan
daraxtlar o'rmoni sifatida ifodalaydi, shuning uchun minimal elementni topish
uchun barcha ildizlarni skanerlash kerak o'rmon. Biroq, biz bu o'rmonni bitta
yig'indiga aylantira olamiz
daraxt, shu bilan O(1) vaqtida findMin-ni qo'llab-quvvatlaydi, shunchaki a qo'shib
minimal elementni ushlab turish uchun global ildiz. Umuman olganda, bu daraxt
bo'lmaydi binomial yoki qiyshiq binomial daraxt bo'ling, lekin bu vaqtdan beri
ahamiyatsiz global ildiz navbatning qolgan qismidan alohida ko'rib chiqiladi. The
Ushbu o'zgarishlarning tafsilotlari odatiy holdir, ammo biz ularni taqdim
etamiz baribir, yanada murakkab transformatsiyalar uchun isinish sifatida
keyingi bo'lim.
19](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_19.png)
![3. Global ildiz qo'shish
Keyinchalik biz ustuvorlik bo'yicha modul darajasidagi oddiy
transformatsiyani tasvirlaymiz findMin ning ishlash vaqtini O(1) ga qisqartirish
uchun navbatlar. Garchi bu transformatsiya har qanday ustuvor navbat moduliga
qo'llanilishi mumkin, bu faqat findMin O(1) vaqtidan ko'proq narsani talab
qiladigan ustuvor navbatlarda foydalidir. Ko'pgina ustuvor navbatlar navbatni
bitta sifatida ifodalaydi. Minimal element har doim topilishi uchun yig'ilgan tartibli
daraxt O (1) vaqtida ildizda. Afsuski, binomial navbatlar va egilish binomial
navbatlar navbatni to'plangan daraxtlar o'rmoni sifatida ifodalaydi, shuning uchun
minimal elementni topish uchun barcha ildizlarni skanerlash kerak. Biroq, biz bu
o'rmonni bitta yig'indiga aylantira olamiz. Daraxt, shu bilan O(1) vaqtida findMin-
ni qo'llab-quvvatlaydi, shunchaki a qo'shib minimal elementni ushlab turish uchun
global ildiz. Umuman olganda, bu daraxt bo'lmaydi. Binomial yoki qiyshiq
binomial daraxt bo'ling, lekin bu vaqtdan beri ahamiyatsiz. Global ildiz navbatning
qolgan qismidan alohida ko'rib chiqiladi. Ushbu o'zgarishlarning tafsilotlari odatiy
holdir, ammo biz ularni baribir taqdim etamiz.
Elementlarni o'z ichiga olgan ibtidoiy ustuvor navbatlarning ba'zi turdagi P
a
berilgan a tipidagi RP
a bo'lishi kerak bo'lgan ildizli ustuvor navbatlar turini
aniqlaymiz
RP
a = {bo sh} + (a × Pʻ
a ) (1)
Boshqacha qilib aytadigan bo'lsak, ildizli ustuvor navbat yo bo'sh yoki juft a
20](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_20.png)
![yagona element (ildiz) va ibtidoiy ustuvor navbat. Biz har qanday bo'sh bo'lmagan
ustuvorlikning minimal elementi bo'lgan invariant navbat ildizda saqlaymiz. Har
bir f operatsiyasi uchun ustuvor navbatlar, f :
functor AddRoot (Q : PRIORITY QUEUE) : PRIORITY QUEUE =
struct
structure Elem = Q.Elem
datatype T = Empty | Root of Elem.T × Q.T
val empty = Empty
fun isEmpty Empty = true
| isEmpty (Root ) = false
fun insert (y, Empty) = Root (y, Q.empty)
| insert (y, Root (x, q)) =
if Elem.leq (y, x) then Root (y, Q.insert (x, q)) else Root (x, Q.insert (y, q))
fun meld (Empty, rq) = rq
| meld (rq, Empty) = rq
| meld (Root (x1, q1), Root (x2, q2)) =
if Elem.leq (x1, x2) then Root (x1, Q.insert (x2, Q.meld (q1, q2)))
else Root (x2, Q.insert (x1, Q.meld (q1, q2)))
exception EMPTY
fun findMin Empty = raise EMPTY
| findMin (Root (x, q)) = x
fun deleteMin Empty = raise EMPTY
| deleteMin (Root (x, q)) =
if Q.isEmpty q then Empty else Root (Q.findMin q, Q.deleteMin q)
end
f0 mos ravishda P
a va RP
a ustidagi amallarni bildiradi. Keyin,
findMin0 (hx, qi) = x
21](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_21.png)
![insert0 (y,hx, qi) = hx, qo'shing (y,q)i agar x ≤ y bo'lsa
insert0 (y,hx, qi) = hy, insert (x, q)i if y<x
meld0 (hx1, q1i,hx2, q2i) = hx1, insert (x2, meld (q1, q2))i if x1 ≤ x2
meld0 (hx1, q1i,hx2, q2i) = hx2, insert (x1, meld (q1, q2))i if x2 < x1
deleteMin0 (hx, qi) = hfindMin (q), deleteMin (q)i
Biz ushbu transformatsiyani standart ML funktori sifatida taqdim etamiz. U
ustuvor navbat tuzilishini oladi va yangi tuzilmani ishlab chiqaradi. Ushbu
optimallashtirishni o'z ichiga oladi. Skew binomialga qo'llanilganda oldingi
bo'limning navbatlari, bu transformatsiya O(1) vaqtida insert va findMin ni qo'llab-
quvvatlaydigan ustuvor navbat hosil qiladi. Biroq, meld va deleteMin hali ham
O(log n) vaqtini talab qiladi. Agar dastur turli elementli bir nechta ustuvor
navbatlarni talab qilsa, bu transformatsiyani a sifatida amalga oshirish qulayroq
bo'lishi mumkin. Yuqori darajadagi funktor (MacQueen & Tofte, 1994). Birinchi
tartibli funktorlar faqat tuzilmalarni olishi va qaytarishi mumkin, lekin yuqori
tartibli funktorlar mumkin. Boshqa funktorlarni ham qabul qiling va qaytaring.
Garchi ta'rifi
Standart ML (Milner va boshq., 1990) faqat birinchi darajali funktorlarni
tavsiflaydi,
Standard ML ning ba'zi ilovalari, xususan Standard ML of New Jersi, yuqori
darajadagi funktorlarni qo'llab-quvvatlang. BinomialQueue yoki Skew Binomial
Queue kabi ustuvor navbat funksiyasi tartiblangan elementlar turini ko'rsatuvchi
tuzilmani oladi va quyidagi elementlarni o'z ichiga olgan ustuvor navbatlar
belgilangan tur strukturasini qaytaradi. Quyidagi yuqori tartibli funktor ustunlikka
ega queue functor va ni o'z ichiga olgan ustuvor navbat funktorini qaytaradi.
3.1. AddRoot optimallashtirish. bu transformatsiya O(1) vaqtida insert va
findMin ni qo'llab-quvvatlaydigan ustuvor navbat hosil qiladi. Biroq, meld va
deleteMin hali ham O(log n) vaqtini talab qiladi. Agar dastur turli elementli bir
nechta ustuvor navbatlarni talab qilsa, bu transformatsiyani a sifatida amalga
oshirish qulayroq bo'lishi mumkin yuqori darajadagi funktor (MacQueen & Tofte,
22](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_22.png)
![1994). Birinchi tartibli funktorlar faqat tuzilmalarni olishi va qaytarishi mumkin,
lekin yuqori tartibli funktorlar mumkin. Boshqa funktorlarni ham qabul qiling va
qaytaring. Garchi ta'rifi Standart ML (Milner va boshq., 1990) faqat birinchi
darajali funktorlarni tavsiflaydi, Standard ML ning ba'zi ilovalari, xususan
Standard ML of New Jersi, yuqori darajadagi funktorlarni qo'llab-quvvatlang.
Binomial Queue yoki Skew Binomial Queue kabi ustuvor navbat funksiyasi
tartiblangan elementlar turini ko'rsatuvchi tuzilmani oladi va quyidagi elementlarni
o'z ichiga olgan ustuvor navbatlar strukturasini qaytaradi. belgilangan tur.
Quyidagi yuqori tartibli funktor ustunlikka ega queue functor va ni o'z ichiga olgan
ustuvor navbat funktorini qaytaradi AddRoot optimallashtirish.
functor AddRootToFun (functor MakeQ (E : ORDERED) :
sig
include PRIORITY QUEUE
sharing Elem = E
end)
(E : ORDERED) : PRIORITY QUEUE =
AddRoot (MakeQ (E))
E'tibor bering, bu funktor kurerli, shuning uchun u ikkita argumentlarni oladi, u
aslida bitta argumentni oladi (MakeQ) va a ni qaytaradi ikkinchi argumentni qabul
qiluvchi funktor (E). Ulashish cheklovi Funktor MakeQ ustuvor navbatni
qaytarishini ta'minlash uchun zarur kerakli element turi bilan. Almashish
cheklovisiz, MakeQ E ni e'tiborsiz qoldirishi va ba'zi bir ixtiyoriy element turiga
ega ustuvor navbat strukturasini qaytarishi mumkin. Endi, agar bizga satr ustuvor
navbati va butun son ustuvorligi kerak bo'lsa navbat, biz yozishimiz mumkin :
functor RootedSkewBinomialQueue =
AddRootToFun (functor MakeQ = SkewBinomialQueue)
23](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_23.png)
![structure StringQueue = RootedSkewBinomialQueue (StringElem)
structure IntQueue = RootedSkewBinomialQueue (IntElem)
bu erda StringElem va IntElem ORDERED imzosiga mos keladi va mos ravishda
satrlar va butun sonlar bo'yicha kerakli tartiblarni aniqlaydi.
3.2. Bootstrapping ustuvor navbatlar . Nihoyat, a ni qo'llash orqali
eritmaning ishlash vaqtini O(1) ga yaxshilaymiz. Buchsbaum va boshqalarning
texnikasi. (Buchsbaum va boshqalar, 1995; Buchsbaum & Tarjan, 1995)
ma'lumotlar-strukturali yuklash deb ataladi. Asosiy fikr deb ustuvor navbatlar
yordamida oddiy kiritish uchun eritish kamaytirish hisoblanadi. Boshqa ustuvor
navbatlarni o'z ichiga oladi. Keyin, ikkita ustuvor navbatni birlashtirish uchun biz
shunchaki bir ustuvor navbatni ikkinchisiga qo'ying. Oldingi bo'limda bo'lgani
kabi, biz yuklashni ustuvor navbatlarda modul darajasidagi transformatsiya sifatida
tasvirlaymiz. P
a ibtidoiyning turi bo'lsin a tipidagi elementlarni o'z ichiga olgan
ustuvor navbatlar. Biz elementlarini o'z ichiga olgan yuklangan ustuvor
navbatlarning BP
a turi
a turini qurishni xohlaymiz. Yuklangan ustuvor navbat ibtidoiy ustuvorlik
"elementlari" boshqa yuklangan ustuvor navbatlar bo'lgan navbat kabi bo'ladi.
Birinchi urinish, biz ko'rib chiqamiz :
BP
a = PP
a (2)
Bu erda biz yuklashning yagona darajasini qo'lladik. Biroq, bu oddiy yechim
ishlamaydi, chunki yuqori darajadagi elementlar ibtidoiy ustuvor navbat noto'g'ri
turga ega - ular yuklangan ustuvor navbatlardan ko'ra oddiy ibtidoiy ustuvor
navbatlardir. Aniq, bootstrapping g'oyasini rekursiv ravishda qo'llashimiz kerak,
masalan
BP
a = P
bp a (3)
Afsuski, bu yechim oddiy elementlarni saqlash uchun joy taklif qilmaydi.
24](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_24.png)
![Shuning uchun biz oldingi bo'limdan qarz olamiz va har biriga ildiz qo'shamiz
ibtidoiy ustuvor navbat.
BP
a = a × P
bp a (4)
Shunday qilib, yuklangan ustuvor navbat oddiy elementdir (bu kerak navbatdagi
minimal element bo'lsin) primitiv ustuvorlik bilan bog'langan. Ular tomonidan
buyurtma qilingan boshqa yuklangan ustuvor navbatlarni o'z ichiga olgan navbat
tegishli minimumlar. Bootstrapping har bir ibtidoiy ustuvor navbatga ildiz
qo'shganligi sababli, bootstrapping transformatsiyasi o'z ichiga oladi. AddRoot
transformatsiyasi. Nihoyat, biz imkoniyatga ruxsat berishimiz kerak
bo'sh navbat. Yakuniy ta'rif shunday
BP
a = {bo'sh} + R
a bu erda R
a = a × P R
a (5)
E'tibor bering, ibtidoiy ustuvor navbatlar element sifatida faqat bo'sh bo'lmagan
yuklangan ustuvor navbatlarni o'z ichiga oladi. Endi yuklangan ustuvor
navbatlardagi operatsiyalarning har biri bo'lishi mumkin. Ibtidoiy ustuvor
navbatlar bo'yicha operatsiyalar nuqtai nazaridan aniqlanadi. Uchun ustuvor
navbatlardagi har bir f operatsiyasi f va f0 operatsiyalarni bildirsin mos ravishda
PR
a va BP
a bo'yicha. Keyin,
findMin0 (hx, qi) = x
insert0 (x, q) = meld0 (hx, emptyi, q)
meld0 (hx1, q1i,hx2, q2i) = hx1, insert (hx2, q2i, q1)i if x1 ≤ x2
meld0 (hx1, q1i,hx2, q2i) = hx2, insert (hx1, q1i, q2)i if x2 < x1
deleteMin0 (hx, qi) = hy, meld(q1, q2)i
where hy,q1i = findMin (q)
q2 = deleteMin (q)
Keyinchalik, yuklangan ustuvor navbatlarning samaradorligini ko'rib
chiqamiz.
Minimal element ildizda saqlanganligi sababli findMin O(1) ni talab qiladi.
Asosiy amalga oshirishdan qat'iy nazar vaqt qo'shish va birlashtirish operatsiyalar
25](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_25.png)
![faqat ibtidoiy amalga oshirishning kiritilishiga bog'liq. Egrilik kabi O(1) kiritish
bilan ustuvor navbatni yuklash orqali binomial navbatlar, biz O (1) kiritish va O
(1) ni olamiz. Nihoyat, yuklangan ustuvor navbatlarda deleteMin bog'liq findMin-
da, asosiy dasturdan birlashtiring va deleteMin-ni tanlang. Egri binomial navbatlar
O (log n) vaqtida ularning har birini qo'llab-quvvatlaganligi sababli, Bootstrapped
skew binomial navbatlardagi deleteMin ham O(log n) ni talab qiladi. Lekin, hech
qanday taqqoslashga asoslangan ustuvor navbat qo'shishni yaxshiroq qo'llab-
quvvatlay olmaydi. O(log n) eng yomon holat vaqti yoki O(n) eng yomon holat
vaqtidan yaxshiroq aralashish findMin yoki deleteMin dan biri kamida O(log n)
eng yomon holatni qabul qilmasa vaqt (Brodal, 1995). Yuklash jarayoni standartda
oqlangan tarzda ifodalanishi mumkin. ML yuqori tartibli funktorlar va rekursiv
tuzilmalar bilan kengaytirilgan, kabidir. Bootstrap ning yuqori tartibli tabiati
o'xshashdir. AddRootToFun ning yuqori tartibli tabiatiga, RootedQ va Q
o'rtasidagi rekursiya esa Ra va PRa o'rtasidagi rekursiyani ushlaydi. Afsuski,
Standard ML ning ba'zi ilovalari qo'llab-quvvatlansa ham yuqori tartibli funktorlar
(MacQueen & Tofte, 1994), hech biri rekursiv tuzilmalarni qo'llab-quvvatlamaydi,
shuning uchun RootedQ va Q o'rtasidagi rekursiya taqiqlanadi. Aslida, bu kabi
rekursiyani qo'llab-quvvatlamaslik uchun yaxshi sabablar bor umumiy. Misol
uchun, agar MakeQ bo'lsa, bu rekursiya hatto mantiqiy bo'lmasligi mumkin
hisoblash effektlari bo'lishi mumkin! Biroq, SkewBinomialQueue kabi ko'plab
ustuvor navbat funksiyalari shunchaki bir nechta ma'lumotlar turlarini belgilaydi
va funktsiyalari va hisoblash effektlariga ega emas. Bu yaxshi xulqlilar uchun
Funktorlar uchun RootedQ va Q o'rtasidagi rekursiya mantiqiy ko'rinadi va bu
funktorlarni yuklash yoqimli bo'lardi.
shu tarzda.
Xulosa qilib aytganda, yuklangan skew binomial navbatlar O(1) vaqtidagi
har bir amalni qo llab-quvvatlaydi, bu O(log n) vaqtini talab qiladiganʻ
deleteMindan tashqari. Bu chegaralar barcha taqqoslashga asoslangan ustuvor
navbatlar orasida optimal ekanligini tartiblashni qisqartirish orqali ko'rsatish oson.
26](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_26.png)
![Turli operatsiyalarning ishlash vaqtlari o'rtasidagi boshqa kelishuvlar ham
mumkin.
Rekursiv tuzilmalarsiz biz hali ham bootstrapped-ni amalga oshirishimiz
mumkin. Ustuvor navbatlar, lekin juda kamroq toza. MakeQ uchun tegishli ustuvor
navbat funksiyasini kiritib, Q va RootedQ-ni yo'q qilish orqali Bootstrap-ni
istalgan ibtidoiy ustuvor navbatga qo'lda ixtisoslashtiramiz. Alohida tuzilmalar
sifatida. Bu standart ML tomonidan osonlik bilan qo'llab-quvvatlanadigan
ma'lumotlar turlari bo'yicha rekursiyaga tuzilmalardagi rekursiyani kamaytiradi.
Albatta, har qanday qo'lda dasturni o'zgartirish kabi, bu jarayon zerikarli va xatoga
moyil.
functor Bootstrap (functor MakeQ (E : ORDERED) : sig
include PRIORITY QUEUE
sharing Elem = E
end)
(E : ORDERED) : PRIORITY QUEUE =
struct
structure Elem = E
( ∗ recursive structures not supported in SML! ∗ )
structure rec RootedQ =
struct
datatype T = Root of Elem.T × Q.T
fun leq (Root (x1, q1), Root (x2, q2)) = Elem.leq (x1, x2)
end
and Q = MakeQ (RootedQ)
open RootedQ ( ∗ expose Root constructor ∗ )
datatype T = Empty | NonEmpty of RootedQ.T
val empty = Empty
fun isEmpty Empty = true
27](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_27.png)
![| isEmpty (NonEmpty ) = false
fun insert (x, xs) = meld (NonEmpty (Root (x, Q.empty)), xs)
and meld (Empty, xs) = xs
| meld (xs, Empty) = xs
| meld (NonEmpty (r1 as Root (x1, q1)), NonEmpty (r2 as Root (x2, q2))) =
if Elem.leq (x1, x2) then NonEmpty (Root (x1, Q.insert (r2, q1)))
else NonEmpty (Root (x2, Q.insert (r1, q2)))
exception EMPTY
fun findMin Empty = raise EMPTY
| findMin (NonEmpty (Root (x, q))) = x
fun deleteMin Empty = raise EMPTY
| deleteMin (NonEmpty (Root (x, q))) =
if Q.isEmpty q then Empty
else let val (Root (y, q1)) = Q.findMin q
val q2 = Q.deleteMin q
in NonEmpty (Root (y, Q.meld (q1, q2))) end
end
3.3. Optimallashtirish . Oldingi bo'limda tasvirlangan yuklangan egilgan binomial
navbatlar asimptotik jihatdan optimal bo'lsa-da, biz hali ham qo'shimcha
optimallashtirishlarni amalga oshirishimiz mumkin. Natijada paydo bo'ladigan
ustuvor navbatlar turini ko'rib chiqing.
MakeQ uchun SkewBinomialQueue qatoridan:
Datatype Tree = Ildiz tugun × Rank × Daraxt ro'yxati
va Root = Root of Elem.T × Tree ro'yxati
ma'lumotlar turi T = Bo'sh | Ildiz bo'sh emas
Ushbu tasvirda tugun Node(Root(x, f), r, c) ko'rinishiga ega, bu erda x - element, f
- o'rmonni ifodalovchi daraxtlar ro'yxati, r - daraja va c - tugunning bolalarini
28](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_28.png)
![ifodalovchi daraxtlar ro'yxati. Har yili tugun x va f ni o'z ichiga oladi, biz
tugunlarning tasvirini tekislashimiz mumkin.
datatype Tree = Elem.T tugunlari × Daraxtlar ro'yxati × Rank × Daraxtlar
ro'yxati.
Ko'pgina ilovalarda bu har birida bilvositalikni yo'q qiladi x ga kirish.
Keyinchalik, f ildizi o'chirilmaguncha butunlay e'tiborga olinmasligini unutmang.
Shunday qilib, biz f ga to'g'ridan-to'g'ri kirishni talab qilmaymiz va uni aslida
saqlashimiz mumkin. c ning dumi, ikkalasini c ++ f ni ifodalovchi yagona
ro'yxatga birlashtiradi. Bu odatda so'zni saqlaydigan quyidagi vakillikka olib
keladi.
Har bir tugunda saqlash:
Datatype Tree = Elem.T tugunlari × Rank × Daraxtlar ro'yxati
Ushbu ko'rinishda deleteMin davomida c ni kesib o'tish kerak. f ga kirish
uchun, lekin biz 0 darajasini olish uchun baribir c orqali o'tishimiz kerak bolalar va
qolgan bolalarni teskari aylantiring. r darajali tugun berilgan, c qayerda tugaydi va
f qaerda boshlanadi aniqlash odatda juda oson. Agar r = 0 bo'lsa, keyin c = [ ].
Agar r = 1 bo'lsa, u holda c bitta yoki ikkita 0 darajasidan iborat tugunlar. Agar r >
1 bo'lsa, u holda c bir xil juft tugunlar bilan tugaydi nolga teng bo'lmagan daraja
yoki 1-darajali tugun, undan keyin bir yoki ikkita darajali 0 tugunlari. Faqatgina
noaniqliklar 0-darajali tugunlarni o'z ichiga oladi: ba'zida bu mumkin emas. c dan
ikkita darajali 0 tugunlari bilan tugaydigan holatni ajratish uchun c bitta darajali 0
tugun bilan tugaydigan va f daraja bilan boshlanadigan holat 0 tugun. Biroq, har
bir bunday vaziyatda, uni davolash hech qanday zarar qilmaydi noaniq tugun,
xuddi f emas, c ning bir qismi.
Yakuniy soddalashtirish sifatida, daraxtlar va orasidagi farqni unutmang
ildizlar kerak emas, chunki har bir ildizni darajali daraxt sifatida ko'rish mumkin
Bizning yakuniy vakilimiz keyin
datatype Tree = Elem.T tugunlari × Rank × Daraxtlar ro'yxati
ma'lumotlar turi T = Bo'sh | NonEmpty of Tree
29](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_29.png)
![Bu har bir ildizning hajmini biroz oshiradi, lekin ba'zilarini ham yo'q qiladi
melds paytida kichik nusxa ko'chirish.
4. Tegishli ish va muhokama
Imperativ ustuvor navbatlar bo'yicha juda ko'p adabiyot mavjud bo'lsa-da,
sof funktsional ustuvor navbatlar ustida juda kam ish olib borildi. Paulson (1991)
birlashtirish (birlashtirib bo'lmaydigan) ustuvor navbatni tasvirlaydi an'anaviy
ravishda yashirin yig'ish texnikasi (Williams, 1964) ning muvozanatli daraxt
tasviri bilan massivlar yordamida amalga oshiriladi. Orqa tomonda kengaytmani
qo'llab-quvvatlovchi massivlar. Hoogerwoord (1992) Paulson kabi daraxtlardan
foydalangan holda massivlarni ifodalaydi, lekin massivlarga ham ruxsat beradi.
old tomondan uzaytirilishi kerak. dan foydalangan holda Paulson navbatlarining
bir varianti Hoogerwoord-ning biroz sodda oldingi kengaytmasi uning bir qismi
bo'lib funktsional folklor dasturlash ko'rinadi.
King (1994) binomialning sof funktsional navbatlar amalga oshirilishini
taqdim etadi. Garchi binomial navbatlar imperativ sharoitlarda ancha murakkab
hisoblansa ham (Jones, 1986), King shuni ko'rsatadiki, funktsional tillarning
ro'yxatini qayta ishlashning qulayroq imkoniyatlari binomial navbatlarni juda
oqlangan tarzda qo'llab-quvvatlang.
Schoenmakers (1992), Kaldewaij bilan oldingi ishlarni kengaytirdi (1991),
30](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_30.png)
![amortizatsiyalangan chegaralarni chiqarishda yordam berish uchun funktsional
belgilardan foydalanadi. Bir qator ma'lumotlar tuzilmalari uchun, jumladan, uchta
ustuvor navbat: skew heaps1 (Sleator & Tarjan, 1986), Fibonachchi heaps
(Fredman & Tarjan, 1987) va juftlash to'plari (Fredman va boshq., 1986).
Schoenmakers ham
yassi daraxtlarni muhokama qiladi (Sleator va Tarjan, 1985), Jones (1986)
tomonidan eshilmaydigan ustuvor navbat sifatida ayniqsa samarali ekanligi
ko'rsatilgan o'z-o'zidan sozlanadigan ikkilik qidiruv daraxtining shakli. Ushbu
to'rtta ma'lumotlarning har biri tuzilmalar faqat amortizatsiyalangan ma'noda
samarali bo'ladi. U ishlatsa ham funktsional nota, Schoenmakers uning e'tiborini
vaqtinchalik bilan cheklaydi. Ma'lumotlar tuzilmalaridan foydalanish, bu erda
faqat ma'lumotlarning eng so'nggi versiyasi strukturaga kirish yoki yangilash
mumkin. Efemerlik chambarchas bog'liq chiziqlilik tushunchasiga (Wadler, 1990).
Qat'iylikka ruxsat berilganda, An'anaviy amortizatsiya qilingan tahlillar buziladi,
chunki ma'lumotlar strukturasining "qimmat" versiyalari bo'yicha operatsiyalar
o'zboshimchalik bilan tez-tez takrorlanishi mumkin. Okasaki (1995a; 1996)
yashirin yodlashdan qanday foydalanishni tasvirlaydi chegaralari amortizatsiya
qilingan ma'lumotlar tuzilmalarini qo'llab-quvvatlash uchun dangasa baholashda
qat'iylik ostida ham ushlab turing. Biroq, yuqoridagi ma'lumotlar tuzilmalaridan,
Bu texnikaga faqat juftlik uyumlari mos keladi.
Va nihoyat, bizning ma'lumotlar tuzilmasi bir nechta manbalardan texnikani
oladi. Skew linking Okasaki tasodifiy kirish ro'yxatidan olingan (1995b), bu esa
o'z navbatida tasodifiy kirish steklarining modifikatsiyasi hisoblanadi Myers
(1983). Qo'shish narxini kamaytirish uchun biz egilgan bog'lanishdan
foydalanamiz O (1) ga binomial navbatlarda, lekin rekursiv sekinlashuv (Kaplan
va Tarjan, 1995) va dangasa baholash (Okasaki, 1996) uchun ishlatilishi mumkin.
bir xil maqsad. Ma'lumotlar strukturaviy yuklash Buchsbaum tomonidan
qo'llaniladi va boshqalar. (Buchsbaum va boshq., 1995; Buchsbaum va Tarjan,
1995) ikki tomonlama navbatlar uchun katenatsiyani ustuvor navbatlar uchunni
qo'llab-quvvatlash uchun, xuddi biz uni qo'llab-quvvatlash uchun ishlatamiz.
31](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_31.png)
![4.1. Munozara . Biz O(1) eng yomon holatda findMinni qo'llab-quvvatlash,
kiritish va birlashtirish uchun ustuvor navbatlarning birinchi sof funktsional
bajarilishini tasvirlab berdik. Vaqt, va O(log n) eng yomon holatda deleteMin. Bu
chegaralar taqqoslashga asoslangan barcha ustuvor navbatlar orasida asimptotik
optimal. Bizning ma'lumotlar tuzilmasi imperativ ma'lumotlar strukturasini
moslashtirishdir
Brodal (1995) tomonidan kiritilgan, lekin biz ikkalamiz ham uning asl nusxasini
soddalashtirdik. Ma'lumotlar tuzilishi va uning binomial navbatlari bilan
bog'liqligini aniqladi Vuillemin (1978). Bizning ma'lumotlar tuzilmamiz amalda
juda samarali; Ammo, bir necha raqobat ma'lumotlar tuzilmalari bor, garchi
asimptotik jihatdan optimal emas, amalda biznikidan biroz tezroq.
Demak, bizning ishimiz birinchi navbatda nazariy qiziqish uyg'otadi. Asosiy
hudud unda bizning ma'lumotlar tuzilmasi amalda foydali bo'lishi kerak bo'lgan
ilovalar qotishma ustunlik qiladi, ayniqsa doimiy ustuvor navbatlarni talab
qiladigan ilovalar. Biz standart ML-da ma'lumotlar tuzilmamizni amalga oshirgan
bo'lsak-da, a qat'iy funktsional til, uni boshqa funktsional tillarga, hatto Xaskell
kabi dangasa tillarga osongina tarjima qilish mumkin edi (Hudak va boshqalar,
1992). Biroq, dangasa tilda, eng yomon chegaralar bo'ladi. Amortizatsiya qilinadi,
chunki har bir qo'shish, birlashtirish va o'chirishMin amallari ularning natijalari
findMin tomonidan kerak bo'lguncha kechiktiriladi. Masalan, a m kiritish va
birikmalar ketma-ketligidan keyin findMin Ō(m) oladi. Vaqt, garchi bu vaqt
qo'shimchalar bo'yicha amortizatsiya qilinishi mumkin va odatiy tarzda aralashadi.
Bu muammo bizning ma'lumotlar tuzilmamizga xos emas - bu deyarli barcha
nominal ma'lumotlar tuzilmalariga tegishli dangasa tilda. To'liqroq muhokama
qilish uchun Okasaki (1995a; 1996) ga qarang dangasa baholash va amortizatsiya
o'rtasidagi o'zaro ta'sir.
Keyinchalik, imperativ ustuvorlik navbatlari ko'pincha ikkita qo'shimcha
operatsiyani qo'llab-quvvatlashini ta'kidlaymiz, bu kamaytirish va o'chirish
tugmachalari va o'chirish navbatning belgilangan elementi. Ko'rib chiqilayotgan
32](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_32.png)
![element odatda navbatning o'rtasiga ko'rsatgich bilan belgilanadi, lekin bu
funktsional sharoitda noqulay. Bir yondashuvni ifodalashdir navbatni ikkilik
qidiruv daraxti sifatida qo'ying, shuning uchun biz ixtiyoriy elementlarni samarali
qidirishimiz mumkin. Bu, asosan, King (1994) tomonidan qabul qilingan
yondashuv. Jons (1986) tomonidan ampirik taqqoslashlar, yassi daraxtlar bo'lishini
ko'rsatadi bu maqsad uchun ideal bo'l, hech bo'lmaganda asosan vaqtinchalik
foydalanish uchun. Afsuski, ikkilik qidiruv daraxtlarini (jumladan, chayqalish
daraxtlarini) birlashtirish O(n) vaqtini talab qiladi.
Muqobil yondashuv - ikkita ustuvor navbatdan foydalanish, biri
elementlarning "ijobiy" hodisalarini va ikkinchisi "salbiy" ni o'z ichiga olgan
elementlarning paydo bo'lishi. Elementni o chirish uchun uni ichiga kiritish kifoyaʻ
salbiy navbat. Elementni kamaytirish uchun eski qiymatni o'chiring va yangi
qiymatni kiriting. Xuddi shunday ijobiy va salbiy hodisalar element ikkalasi ham
minimal bo'lganda bir-birini bekor qiladi ularning tegishli navbatlari elementlari.
Ushbu yondashuvni Tarjan (1983) dangasa o'chirish operatsiyasining funktsional
analogi sifatida ko'rish mumkin. Salbiy elementlar soni bo'lsa, bu yechim yaxshi
ishlaydi nisbatan kichik. Biroq, ko'p ijobiy-salbiy juftliklar mavjud bo'lganda hali
bir-birini bekor qilmagan, bu yechim ham vaqt, ham makonda samarasiz bo'lishi
mumkin. Qo'llab-quvvatlash uchun qo'shimcha tadqiqotlar talab qilinadi
kamaytirishKey va funktsional sozlamada samarali o'chirish.
Kelajakdagi ishning yakuniy sohasi standart ML modul tizimiga tegishli.
Rekursiv modullar har doim ham mantiqiy emas, va shuning uchun hozirda tilni
amalga oshirishda taqiqlangan. Biroq, modul darajasida rekursiya oqilona ko'rinadi
va foydali ba'zi yaxshi ishlaydigan modullar uchun. Bu qiziq bo'lardi rekursiv
modullar bo'lishi kerak bo'lgan shartlarni rasmiylashtirish ruxsat etiladi va shunga
mos ravishda Standard ML ning ba'zi joriy etilishini kengaytiradi.
33](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_33.png)
![XULOSA
Men “ Brodala – Okasaki uyumi “ mavzusidagi algoritm g’oyasini yanada
mukamalroq o’rgandim. Brodal - Okasaki kaskadli havolalarsiz binomial
qoziqdan foydalanish, minimal element qo'shish va ma'lumotlar strukturasini
yuklash g'oyasiga asoslanganligini bilib oldim. Sof funktsional ma'lumotlar
tuzilmalari imperativ ma'lumotlar tuzilmalaridan kamida ikki jihatdan farq qilar
ekan. Birinchidan, ko'plab imperativ ma'lumotlar tuzilmalari samaradorlik uchun
halokatli topshiriqlarga tayanadi, holbuki sof funktsional ma'lumotlar tuzilmalariga
halokatli topshiriqlardan foydalanish taqiqlanadi. Ikkinchidan, sof funktsional
ma'lumotlar tuzilmalari avtomatik ravishda doimiy ya'ni yangilanishdan keyin
ikkalasi ham ma'lumotlar strukturasining yangi va eski versiyalari keyingi
ma'lumotlar uchun mavjud kirish va yangilanishlardir. Bundan farqli o'laroq,
imperativ ma'lumotlar tuzilmalari deyarli har doim vaqtinchalik bo'lar ekan, ya'ni
yangilanishdan keyin faqat yangi ma'lumotlar strukturasi versiyasi mavjud.
Ko'pgina hollarda, algoritm matnlarida tasvirlanganlar kabi ma'lumotlar tuzilmalari
funktsional dasturchilarga oddiygina foydalanishga to'sqinlik qiladi. Shunday qilib,
samarali sof funktsional ma'lumotlar tuzilmalarini loyihalash katta ahamiyatga ega.
Funktsional dasturchilar uchun nazariy va amaliy qiziqish, shuningdek doimiy
34](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_34.png)
![bo'lgan holatlar uchun imperativ dasturchilarga kelsak ma'lumotlar tuzilishi talab
qilinar ekan.
FOYDALANILGAN ADABIYOTLAR
Brodal, Gert Stolting. (1995). Tez eriydigan ustuvor navbatlar. 282–290 sahifalar:
Algoritmlar va ma'lumotlar tuzilmalari bo'yicha seminar. LNCS, jild. 955.
Springer-Verlag.
Brodal, Gert Stolting. 1996 yil (yanvar). Eng yomon holatda ustuvor navbatlar.
52–58 sahifalar:
Diskret algoritmlar bo'yicha ACM-SIAM simpoziumi.
Braun, Mark R. (1978). Binomli navbat algoritmlarini amalga oshirish va tahlil
qilish.
SIAM Journal on Computing, 7(3), 298–319.
Buchsbaum, Adam L. va Tarjan, Robert E. (1995). Confluently persistent deques
via
ma'lumotlarni tizimli yuklash. Algoritmlar jurnali, 18(3), 513–547.
Buchsbaum, Adam L., Sundar, Rajamani va Tarjan, Robert E. (1995).
Ma'lumotlar-strukturaviy
yuklash, chiziqli yo'lni siqish va katenable yig'ma-tartibli ikki tomonlama
navbatlar. SIAM Journal on Computing, 24(6), 1190–1206.
35](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_35.png)
![Kreyn, Klark Allan. 1972 yil (fevral). Balanslangan ikkilik sifatida chiziqli
ro'yxatlar va ustuvor navbatlar
daraxtlar. Ph.D. dissertatsiya, Stenford universiteti kompyuter fanlari bo'limi.
Mavjud
STAN-CS-72-259 sifatida
Driscoll, Jeyms R., Sarnak, Neil, Sleator, Daniel D. K. va Tarjan, Robert E. (1989).
Ma'lumotlar tuzilmalarini barqaror qilish. Kompyuter va tizim fanlari jurnali,
38(1),
86–124.
Fredman, Maykl L. va Tarjan, Robert E. (1987). Fibonachchi to'plari va ulardan
foydalanish
takomillashtirilgan tarmoqni optimallashtirish algoritmlari. ACM jurnali, 34(3),
596–615.
Fredman, Maykl L., Sedgewick, Robert, Sleator, Daniel D. K. va Tarjan, Robert E.
(1986). Juftlik uyasi: o'z-o'zidan sozlanadigan to'pning yangi shakli. Algoritmik,
1(1),
111–129.
Hud, Robert. 1982 yil (avgust). Juda yuqori darajadagi dasturlash tili
konstruksiyalarini samarali amalga oshirish. Ph.D. dissertatsiya, kompyuter fanlari
kafedrasi,
Kornell universiteti. (Cornell TR 82-503).
Hugervurd, Rob R. (1992). Moslashuvchan massivlarning logarifmik bajarilishi.
Sahifalar
191–207: Dasturni qurish matematikasi bo'yicha konferentsiya. LNCS, jild. 669.
Springer-Verlag.
Hudak, Pol, Peyton Jons, Saymon, Uodler, Filipp, Boutel, Brayan, Fairbairn, Jon,
Fasel, Jozef, Guzman, Marya M., Hammond, Kevin, Xyuz, Jon, Jonson,
Tomas, Kiburts, Dik, Nikhil, Rishiyur, Partain, Uill va Peterson, Jon. (1992).
Haskell funktsional dasturlash tili bo'yicha hisobot, 1.2-versiya. SIGPLAN
36](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_36.png)
![Eslatmalar, 27(5).
Jons, Duglas V. (1986). Ustuvorlik navbati va voqealar to'plamini empirik
taqqoslash
amalga oshirishlar. ACM kommunikatsiyalari, 29(4), 300–311.
Kaldewaij, Anne va Schoenmakers, Berry. (1991). Qattiqroq chegaraning kelib
chiqishi
yuqoridan pastga egilgan uyumlar uchun. Axborotni qayta ishlash xatlari, 37(5),
265–271.
Kaplan, Xaim va Tarjan, Robert E. 1995 (may). Katenatsiya orqali doimiy
ro'yxatlar
rekursiv sekinlashuv. 93–102 sahifalar: Hisoblash nazariyasi bo'yicha ACM
simpoziumi.
King, Devid J. 1994 (sentyabr). Funktsional binomial navbatlar. 141–150 sahifalar:
Glasgow
Funktsional dasturlash bo'yicha seminar.
MakQuin, Devid B. va Tofte, Mads. 1994 yil (aprel). Yuqori tartibli funktorlar
uchun semantika. 409–423 sahifalar: Dasturlash bo'yicha Yevropa simpoziumi.
Milner, Robin, Tofte, Mads va Harper, Robert. (1990). Standartning ta'rifi
ML. Kembrij, Massachusets: MIT matbuoti.
Myers, Eugene W. (1983). Amaliy tasodifiy kirish stek. Axborotni qayta ishlash
Xatlar, 17(5), 241–248.
Okasaki, Kris. 1995a (oktabr). Amortizatsiya, dangasa baholash va qat'iyatlilik:
Ro'yxatlar
dangasa bog'lanish orqali katenatsiya bilan. 646–654 sahifalar: Kompyuter fanlari
asoslari bo yicha IEEE simpoziumi.ʻ
Okasaki, Kris. 1995 yil (iyun). Sof funktsional tasodifiy kirish ro'yxatlari. 86–95
sahifalar:
Funktsional dasturlash tillari va kompyuter arxitekturasi konferensiyasi.
Okasaki, Kris. (1995c). Oddiy va samarali sof funktsional navbatlar va deklar.
37](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_37.png)
![Funktsional dasturlash jurnali, 5(4), 583–592.
Okasaki, Kris. 1996 yil (may). Amortizatsiyalangan ma'lumotlar tuzilmalarida
dangasa baholashning roli.
62–72 sahifalar: Funktsional dasturlash bo'yicha ACM SIGPLAN xalqaro
konferentsiyasi.
Paulson, Lorens C. (1991). Ishchi dasturchi uchun ML. Kembrij: Kembrij
universiteti nashriyoti.
Schoenmakers, Berri. 1992 yil (sentyabr). Ma'lumotlar tuzilmalari va amortizatsiya
qilingan murakkablik a
Funktsional sozlash. Ph.D. dissertatsiya, Eyndxoven Texnologiya Universiteti.
Sleator, Daniel D. K. va Tarjan, Robert E. (1985). O'z-o'zidan sozlanadigan ikkilik
qidiruv daraxtlari.
ACM jurnali, 32(3), 652–686.
Sleator, Daniel D. K. va Tarjan, Robert E. (1986). O'z-o'zidan sozlanadigan to'plar.
SIAM jurnali
Hisoblash bo'yicha, 15(1), 52–69.
Tarjan, Robert E. (1983). Ma'lumotlar tuzilmalari va tarmoq algoritmlari.
Mintaqaviy CBMS
Amaliy matematika bo'yicha konferentsiyalar seriyasi, jild. 44. Filadelfiya: Sanoat
va amaliy matematika jamiyati.
Vuillemin, Jan. (1978). Ustuvor navbatlarni manipulyatsiya qilish uchun
ma'lumotlar strukturasi. ACM kommunikatsiyalari, 21(4), 309–315.
Uodler, Filipp. 1990 yil (aprel). Chiziqli turlar dunyoni o'zgartirishi mumkin! 561–
581 sahifalar:
Dasturlash kontseptsiyalari bo'yicha IFIP TC 2 ishchi konferentsiyasi materiallari
va
Usullari.
Uilyams, J. V. J. (1964). 232-algoritm: Ustma-sort. ACM kommunikatsiyalari,
7(6), 347–348.
38](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_38.png)
![39](/data/documents/5ae68cc2-4edb-412b-92dd-5a6c2eecec88/page_39.png)
Brodala – Okasaki uyumi MUNDARIJA: KIRISH …………………………………………………………………………… 3 1. Brodal va Okasakining ustuvor navbati ……………………………………… 5 1.1 Eng qiyin operatsiya deleteMin ……………………………………………… 6 1.2. Brodalning ma'lumotlar strukturasi ………………………………………...9 2. Ikkilamchi navbatlar ………… … …………………… … …… … …… ……… 12 3. Global ildiz qo'shish … ……………………………… … ………… ………… 20 3.1. AddRoot optimallashtirish … ……………………………… … ………… ... 22 3.2. Bootstrapping ustuvor navbatlar … ……………………………… … ……24 3.3. Optimallashtirish … …… … …… … ……………………………… … ……..28 4. Tegishli ish va muhokama ……… … …… … …… … ………………………… 30 4.1. Munozara ……… … …… …… …… …… ……… … ………………………… 31 XULOSA ……………………………………………………………………….... 34 FOYDALANILGAN ADABIYOTLAR ……………………………………… 35 1
Kirish Brodal Okasaki (ingl. Brodal's and Okasaki's Priority Queue)-kaskadli havolalarsiz binomial qoziqdan foydalanish, minimal element qo'shish va ma'lumotlar strukturasini yuklash g'oyasiga asoslangan. Birinchisi sizga imkon beradi insert uchun O(1), ikkinchisi sizga minimal elementni olish imkonini beradi O(1), uchinchisi esa bajarishga imkon beradi merge uchun O(1). Minimalni olib tashlash quyidagilar uchun ishlaydi O(logN) eng yomon holatda. Ushbu hisob- kitoblar taqqoslashga asoslangan barcha ustuvor navbatlar orasida asimptotik jihatdan maqbuldir. Bu chegaralar asimptotikdir barcha taqqoslashga asoslangan ustuvor navbatlar orasida optimal. Brodalning ma'lumotlar strukturasi sof funktsional sozlamalarga ega. Bunda Vuillemin ma'lumotlar strukturasini soddalashtirish va uning binomial navbatlar bilan aloqasini aniqlashtirish O(log n) vaqtida barcha to'rtta operatsiyani qo'llab-quvvatlaydi. Xususan, biz amalga oshirishni binomial navbatlardan uch bosqichda olamiz: birinchidan, biz kaskadli havolalar imkoniyatidan foydalanib, qo'shimchaning ishlash vaqtini O(1) ga qisqartiramiz; ikkinchidan, minimal elementni ushlab turish uchun global ildiz qo'shish orqali findMin ning ishlash vaqtini O(1) ga qisqartiramiz; va nihoyat, ustuvor navbatlar boshqasini o'z ichiga olishiga ruxsat berish orqali qotishning ishlash vaqti O(1) ga kamaytiramiz. Ushbu bosqichlarning har biri ML uslubidagi funktorlar yordamida ifodalanadi. Ma'lumotlar-strukturali yuklash deb nomlanuvchi so'nggi 2
transformatsiya qiziqarli yuqori tartibli funktorlar va rekursiv tuzilmalarni qo'llashdir. Sof funktsional ma'lumotlar tuzilmalari imperativ ma'lumotlar tuzilmalaridan kamida ikki jihatdan farq qiladi. Birinchidan, ko'plab imperativ ma'lumotlar tuzilmalari samaradorlik uchun halokatli topshiriqlarga tayanadi, holbuki sof funktsional ma'lumotlar tuzilmalariga halokatli topshiriqlardan foydalanish taqiqlanadi. Ikkinchidan, sof funktsional ma'lumotlar tuzilmalari avtomatik ravishda doimiy ya'ni yangilanishdan keyin ikkalasi ham ma'lumotlar strukturasining yangi va eski versiyalari keyingi ma'lumotlar uchun mavjud kirish va yangilanishlardir. Bundan farqli o'laroq, imperativ ma'lumotlar tuzilmalari deyarli har doim vaqtinchalik bo'ladi, ya'ni yangilanishdan keyin faqat yangi ma'lumotlar strukturasi versiyasi mavjud. Ko'pgina hollarda, algoritm matnlarida tasvirlanganlar kabi ma'lumotlar tuzilmalari funktsional dasturchilarga oddiygina foydalanishga to'sqinlik qiladi. Shunday qilib, samarali sof funktsional ma'lumotlar tuzilmalarini loyihalash katta ahamiyatga ega. Funktsional dasturchilar uchun nazariy va amaliy qiziqish, shuningdek doimiy bo'lgan holatlar uchun imperativ dasturchilarga kelsak ma'lumotlar tuzilishi talab qilinadi. Ustuvor navbat kompyuter dasturlashda asosiy abstraksiyadir, faqat lug'at orqali muhimligi oshib ketgan ketma-ketlik. Ustuvor navbatlarning ko'plab tatbiqlari amalga oshirilishi yillar davomida taklif qilingan, kichik namuna : (Williams, 1964; Kran, 1972; Vuillemin, 1978; Fredman va Tarjan, 1987; Brodal, 1996). Biroq, bularning barchasi faqat imperativ ustuvor navbatlarni hisobga oladi. Juda sof funktsional ustuvor navbatlar haqida kam yozilgan. Bizning bilim, faqat Paulson (1991), Kaldewaij va Schoenmakers (1991), Schoenmakers (1992) va King (1994) ustuvorliklarga aniq munosabatda bo'lishdi. 3
1. Brodal va Okasakining ustuvor navbati Binomli navbatlar ustuvor navbatning nafis shaklidir. Vuillemin (1978) va Braun (1978) tomonidan keng o'rganilgan. Garchi ular binomial navbatlarni faqat imperativ sharoitda ko'rib chiqqan bo’lsalar ham, King (1994) binomial navbatlar funktsional sharoitda teng darajada yaxshi ishlashini ko'rsatdi. Ushbu bo'limda biz binomial navbatlarni qisqacha ko'rib chiqamiz . Binomli navbatlar ibtidoiy deb nomlanuvchi ob'ektlardan iborat binomial daraxtlar. Binom daraxtlari induktiv ravishda quyidagicha aniqlanadi: • 0-darajali binom daraxti yagona tugundir. • r+1 darajali binom daraxti ikkita binomni bog‘lash orqali hosil bo‘ladi. r-darajali daraxtlar, bir daraxtni ikkinchisining eng chap bolasi qilib oladi. Ushbu ta'rifdan r darajali binomial daraxt ekanligini ko'rish oson aniq 2r tugunni o'z ichiga oladi. Ikkinchi, ekvivalent ta'rifi. Ba'zan qulayroq bo'lgan binomial daraxtlar: binomial daraxt r rank - r bolalar t1 ...tr bo'lgan tugun, bu erda har bir ti binomdir r - i darajali daraxt. Tugunlar bo'yicha umumiy tartibni nazarda tutsak, binomial daraxt deyiladi har bir tugun ≤ har bir avlodi bo'lsa, yig'ma tartibli. Saqlash uchun Ikki uyin tartibli daraxtlarni bog'lashda yig'ish tartibini qilamiz ildizi kattaroq daraxt - kichikroq ildizli daraxtning bolasi, bilan aloqalar o'zboshimchalik bilan uziladi. 4
Bir binomial binomial navbat, bu erda yig'ilgan tartibli binomial daraxtlar o'rmonidir ikkita daraxt bir xil darajaga ega emas. Chunki binomial daraxtlarning o'lchamlari bor 2 r shakldagi, n o'lchamdagi binomial navbatdagi daraxtlarning qatorlari ning ikkilik ko'rinishidagilarga ko'ra taqsimlanadi. Masalan, 21 o'lchamdagi binomial navbatni ko'rib chiqing. Binar 21 ning ifodasi 10101 va binomial navbatda daraxtlar mavjud 0, 2 va 4-darajali (mos ravishda 1, 4 va 16 o'lchamdagi). E'tibor bering, a n o lchamdagi binomial navbat ko pi bilanʻ ʻ log2(n+1) daraxtini o z ichiga oladi. Endi biz binomial navbatlardagi ʻ operatsiyalarni tasvirlashga tayyormiz. Binomial navbatdagi barcha daraxtlar yig'indisi bo'lganligi sababli, biz buni bilamiz binomial navbatdagi minimal element birining ildizi daraxtlardir. Ushbu minimal elementni O(log n) vaqtida skanerlash orqali topishimiz mumkin ildizlar orqali. Navbatga yangi element qo'shish uchun birinchi navbatda yangi singleton daraxtini yarating (ya'ni, 0-darajali binomial daraxt). Biz keyin bizgacha martabani oshirish tartibida mavjud daraxtlar orqali qadam yo'qolgan darajani toping, biz borar ekanmiz, teng darajadagi daraxtlarni bog'laymiz. Kiritish elementni binomial navbatga qo'shish bittani qo'shishga to'g'ri keladi ikkilik raqam, har bir havola tashishga mos keladi. Eng yomon hol bu n = 2k − 1 o lchamdagi navbatga kiritish ʻ bo lib, jami k ni havolalar va O(log n) vaqti talab qiladi. ikkita navbatni ʻ birlashtirish uchun ikkilik qo'shishga o'xshashlik ham amal qiladi. Biz ikkala navbatning daraxtlari orasidan o'tamiz. Bir marta yana, har bir havola bir tashish mos keladi. Buning uchun O (log n) vaqtni ham talab qiladi. 1.1. Eng qiyin operatsiya bu deleteMin . Biz birinchi navbatda daraxtni topamiz minimal ildiz va uni navbatdan olib tashlaymiz. Biz ildizni olib tashlaymiz, lekin keyin o'z farzandlarini navbatga qaytarishi kerak. Biroq, bolalar o'zlari to'g'ri binomial navbatni tashkil qiladi (ya'ni, bir xil darajadagi ikkita daraxt bo'lmagan tepalikli binomial daraxtlar o'rmoni) va shuning uchun navbatning qolgan daraxtlari bilan birlashtirilishi mumkin. Ikkala topilma daraxtni olib 5