Õppetund
Teooria — Kahendkuhi: eelistusjärjekord massiivis
Kahend-miinimumkuhi on massiiv, milles kohal i olev võti pole suurem kui võtmed kohtadel 2i + 1 ja 2i + 2, tema lapsed. Koha i vanem asub kohal ⌊(i − 1) / 2⌋. Nii vaadates moodustab massiiv kahendpuu, mille kõik tasemed peale viimase on täis ja viimane täitub vasakult paremale. Väikseim võti on alati kohal 0 ehk juures. Võtme lisamiseks pane see massiivi lõppu ja nihuta üles: vaheta võtit vanemaga seni, kuni võti on vanemast väiksem. Väikseima väljavõtmiseks vii viimane võti juureks ja vajuta alla: vaheta seda väiksema lapsega seni, kuni laps on temast väiksem. Sel viisil kasutatav kuhi on eelistusjärjekord.
Mida iga sümbol tähendab
n- võtmete arv kuhjas
i- koht massiivis, nummerdamine algab 0-st
h- koha kõrgus ehk selle all olevate tasemete arv, ⌊log₂(n / (i + 1))⌋
- Eeldab
- Võrdlus võrdleb üht võtit teisega, vahetus vahetab kahe koha võtmed. Viimase võtme viimine juureks väljavõtmise ajal ei lähe kummagi alla. Kui võti on võrdne oma vanema või väiksema lapsega, jääb see paigale. Kahe võrdse lapse hulgast valitakse vasak. Siinne kuhi hoiab väikseimat võtit tipus; maksimumkuhjas on kõik võrdlused vastupidised. Kasutada saab kuni viitteist võtit vahemikus 0 kuni 99, et kogu puu mahuks telefoni ekraanile. Viimases reas loendatakse erinevate võtmete järjestusi.
Ülesanne täielikult lahendatud
-
Mitu võrdlust kulub kummagi ehitusviisiga tuhande võtme korral? 4 sammu
Vajuta Kahanev, ükshaaval ja seejärel Kahanev, alt üles ning selgita, kust tulevad 34 ja 22. Nüüd olgu võtmeid 1 023 ja saabugu need suurimast väiksemani. Mitu võrdlust teeb kumbki meetod?
-
Koht i asub sügavusel ⌊log₂(i + 1)⌋: sügavusel 0 on 1 koht, sügavusel 1 on 2, sügavusel 2 on 4 ja sügavusel 3 on 8 kohta. Kui võtmed saabuvad suurimast väiksemani, on iga uus võti seni saabunutest väikseim ja tõuseb juureni. Iga taseme kohta kulub üks võrdlus ja üks vahetus: 0 + 2 · 1 + 4 · 2 + 8 · 3 = 34.
-
Viimasest vanemast alustades loeb kõrgus: juurel on see 3, kohtadel 1 ja 2 on see 2, sügavusel 2 olevatel 4 kohal on see 1 ning 8 lehel 0. Kõrguste summa on 11. Suurimast väiksemani saabunud võtmete puhul vajub iga võti lõpuni alla. 15 võtmega on igal vanemal kaks last, mistõttu kulub igal tasemel kaks võrdlust: kokku 22 võrdlust ja 11 vahetust.
-
1 023 = 2¹⁰ − 1 võtit moodustavad 10 täis tasemega puu, kus sügavusel d on 2ᵈ kohta. Ükshaaval lisamisel kulub võrdlusi sügavuste summa jagu: 1 · 2 + 2 · 4 + 3 · 8 + ⋯ + 9 · 512 = 8 194 võrdlust ja sama palju vahetusi.
-
Viimasest vanemast alustades kulub võrdlusi kõrguste kahekordse summa jagu. Kõrgusega 0 kohti on 2⁹, kõrgusega 1 kohti 2⁸ ja nii edasi kuni juureni, mille kõrgus on 9: 1 · 256 + 2 · 128 + ⋯ + 9 · 1 = 1 013. See on 1 023 miinus 10 ühte selle arvu kahendesituses. Kahekordne summa annab 2 026 võrdlust; vahetusi on 1 013.
Vastus
Ükshaaval lisades 8 194 võrdlust, viimasest vanemast alustades 2 026, seega ühe võtme kohta ligikaudu kaheksa võrdlust või kaks. Enamik kuhja kohti on suure sügavuse ja väikese kõrgusega: lisamise töömahu määrab sügavus, viimasest vanemast alustava ehituse oma kõrgus. Tööriistas saab kasutada kuni viitteist võtit. Sama arvutus annab seal kuvatavad 34 ja 22.
-
Õpitee
Mida andmestruktuur võimaldab odavalt teha
Allikad (2)
- Heapsort as first published: J. W. J. Williams, "Algorithm 232: Heapsort," Communications of the ACM 7(6), 347–348, June 1964.
- The heap-based sort published six months later, close to the version used today: Robert W. Floyd, "Algorithm 245: Treesort 3," Communications of the ACM 7(12), 701, December 1964.