Hunniku andmestruktuuride illustratsioon
Hunnikuid on kahte tüüpi: max-heap ja min-heap. Max-kuhja struktuur on koht, kus maksimaalne väärtus on juur ja puu langemisel muutuvad väärtused väiksemaks; ükskõik milline vanem on väärtusega võrdne või suurem kui kumbki tema vahetu laps. Min-kuhja struktuur on koht, kus minimaalne väärtus on juur ja väärtus langeb puu laskumisel suuremaks; ükskõik milline vanem on kas võrdne või väiksem kui tema kumbki laps. Järgmistes diagrammides on esimene max-hunnik ja teine min-heap:
Mõlema hunniku puhul pange tähele, et paaril lastel pole vahet, kas vasakpoolne on suurem väärtus. Puu tasemel olev rida ei pea olema tingimata vasakult minimaalselt maksimaalselt täidetud; seda ei täideta tingimata ka maksimaalselt minimaalselt, vasakult.
Hunniku kujutamine massiivis
Selleks, et tarkvara saaks kuhja hõlpsalt kasutada, peab see olema massiivis esindatud. Massiivis on ülal toodud maksimaalne hunnik:
89, 85, 87, 84, 82, 79, 73, 80, 81,, 65, 69Seda tehakse massiivi esimese väärtusena algväärtusest. Väärtused paigutatakse pidevalt, lugedes puud vasakult paremale, ülevalt alla. Kui element puudub, jäetakse selle asukoht massiivis vahele. Igal sõlmel on kaks last. Kui sõlm asub indeksil (positsioonil) n, on selle massiivi esimene indeks indeksil 2n + 1 ja järgmine laps indeksil 2n + 2. 89 on indeksil 0; tema esimene laps, 85 on indeksil 2 (0) + 1 = 1, teine laps indeksil 2 (0) + 2 = 2. 85 on indeksil 1; tema esimene laps, 84, on indeksil 2 (1) + 1 = 3, teine laps, 82, indeksil 2 (1) + 2 = 4. 79 on indeksil 5; tema esimene laps, 65 on indeksil 2 (5) + 1 = 11, teine laps indeksil 2 (5) + 2 = 12. Valemeid rakendatakse massiivi ülejäänud elementidele.
Sellist massiivi, kus elemendi tähendus ja elementide omavaheline suhe tuleneb elemendi positsioonist, nimetatakse implitsiitseks andmestruktuuriks.
Ülaltoodud min-kuhja kaudne andmestruktuur on:
65, 68, 70, 73, 71, 83, 84,, 79, 80,, 85, 89Ülaltoodud max-heap on täielik binaarne puu, kuid mitte täielik binaarne puu. Sellepärast on mõned asukohad (positsioonid) massiivis tühjad. Täieliku binaarse puu korral pole ükski asukoht massiivis tühi.
Kui hunnik oleks peaaegu täielik puu, näiteks kui väärtus 82 puuduks, oleks massiiv järgmine:
89, 85, 87, 84, 79, 73, 80, 81,, 65, 69Selles olukorras on kolm asukohta tühjad. Kuid valemid on endiselt kohaldatavad.
Operatsioonid
Andmestruktuur on andmete vorming (nt.g. puu), pluss suhe väärtuste vahel, pluss väärtustega tehtavad toimingud (funktsioonid). Hunniku jaoks on kogu kuhjaga läbiv suhe see, et vanem peab olema maksimaalse hunniku väärtusega võrdne või suurem kui lapsed; ja vanem peab olema vähemalt kuhjaga väärtuslik või väiksem kui lapsed. Seda suhet nimetatakse kuhjaomaduseks. Hunniku toimingud on rühmitatud loomise, põhi, sisemise ja inspekteerimise alla. Järgneb hunniku toimingute kokkuvõte:
Hunnikuoperatsioonide kokkuvõte
Hunnikute puhul on levinud teatud tarkvaratoimingud:
Hunniku loomine
create_heap: Hunniku loomine tähendab kuhja esindava objekti moodustamist. C keeles saate luua struktuuriobjekti tüübiga kuhja. Üheks struktuuri liikmeks saab kuhja massiiv. Ülejäänud liikmed on hunniku funktsioonid (toimingud). Create_heap tähendab tühja kuhja loomist.
Heapify: kuhja massiiv on osaliselt sorteeritud (järjestatud) massiiv. Heapify tähendab, pakkuge sorteerimata massiivi hunnik massiivi - vt allpool üksikasju.
Ühendamine: see tähendab, et moodustage kahest erinevast hunnikust liitmik - vt üksikasju allpool. Mõlemad hunnikud peaksid olema kas maks-kuhja või mõlemad min-kuhjad. Uus kuhi on kooskõlas kuhja omadusega, samas kui algsed kuhjad säilivad (pole kustutatud).
Sulamine: see tähendab, et ühendage kaks sama tüüpi kuhja, et moodustada uus, säilitades duplikaadid - vt allpool üksikasju. Uus kuhi on kooskõlas kuhja omadusega, samas kui algsed kuhjad hävitatakse (kustutatakse). Peamine erinevus ühendamise ja ühendamise vahel seisneb selles, et sulatamiseks sobib üks puu alampuuna teise puu juure, võimaldades uues puus duplikaate, samas kui ühendamiseks moodustatakse uus kuhjapuu, eemaldades duplikaadid. Kahte algset kuhja pole vaja koos sulatada.
Hunniku põhitoimingud
find_max (find_min): leidke massiivi max-heap maksimaalne väärtus ja tagastage koopia või leidke massiivi min-heap minimaalne väärtus ja tagastage koopia.
Sisesta: lisage kuhja massiivi uus element ja korraldage massiiv ümber nii, et diagrammi kuhja omadus säiliks.
extract_max (extract_min): leidke massiivi max-heap maksimaalne väärtus, eemaldage see ja tagastage see; või leidke massiivi min-heap minimaalne väärtus, eemaldage see ja tagastage see.
delete_max (delete_min): leidke max-heap juursõlm, mis on massiivi max-heap esimene element, eemaldage see tingimata tagastamata; või leidke min-kuhja juursõlm, mis on massiivi min-heap esimene element, eemaldage see tingimata tagastamata;
Asenda: leidke mõlema kuhja juursõlm, eemaldage see ja asendage see uuega. Pole tähtis, kas vana juur tagastatakse.
Sisemised kuhjaoperatsioonid
suurendada_klahvi (vähendada_võtit): suurendage mis tahes sõlme väärtust max-kuhja jaoks ja korraldage ümber nii, et säiliks kuhja omadus, või vähendage mis tahes sõlme väärtust min-kuhja jaoks ja korraldage nii, et kuhja omadus säiliks.
Kustuta: kustutage ükskõik milline sõlm, seejärel korraldage ümber, nii et kuhja omadus säiliks max-heap või min-heap jaoks.
shift_up: liigutage sõlme max-kuhjas või min-kuhjas üles nii kaua kui vaja, korraldades kuhja omaduse säilitamiseks ümber.
shift_down: liigutage sõlme max-kuhjas või min-kuhjas allapoole nii kaua kui vaja, korraldades kuhja omaduse säilitamiseks ümber.
Hunniku ülevaatus
Suurus: See tagastab kuhja võtmete arvu (väärtused); see ei sisalda kuhja massiivi tühje asukohti. Hunnikut saab kujutada koodiga, nagu skeemil, või massiiviga.
on tühi: See tagastab tõeväärtuse Boolean true, kui hunnikus pole sõlme, või Boole'i väärtus false, kui hunnikul on vähemalt üks sõlm.
Hunnikus sõelumine
On sõelumine üles ja alla:
Sift-Up: See tähendab sõlme vahetamist vanemaga. Kui kuhja omadusi ei rahuldata, vahetage vanem oma vanemaga. Jätkake seda rada, kuni kuhja omadus on täidetud. Protseduur võib jõuda juureni.
Sift-down: See tähendab suure väärtusega sõlme vahetamist kahest lapsest väiksema (või ühe lapsega peaaegu täieliku kuhja vastu). Kui kuhja omadusi ei rahuldata, vahetage alumine sõlm oma kahe lapse väiksema sõlmega. Jätkake seda rada, kuni kuhja omadus on täidetud. Protseduur võib ulatuda leheni.
Kogunev
Heapify tähendab sorteerimata sorteerimata massiivi, et kuhja omadus oleks maksimaalse või min-kuhja jaoks rahuldatud. See tähendab, et uues massiivis võib olla mõni tühi koht. Põhialgoritm max-kuhja või min-kuhja kuhjamiseks on järgmine:
- kui juursõlm on ekstreemsem kui ükskõik milline tema lapse sõlm, vahetage juur vähemäärmusliku lapsesõlmega.
- Korrake seda sammu laste ettetellimisskeemis olevate laste sõlmedega.
Viimane puu on kuhja omadusi rahuldav kuhjapuu. Hunnikut võib kujutada puu diagrammina või massiivina. Saadud hunnik on osaliselt sorteeritud puu, st.e. osaliselt sorteeritud massiiv.
Hunniku operatsiooni üksikasjad
Artikli selles jaotises on toodud üksikasjad kuhjaoperatsioonide kohta.
Hunniku üksikasjade loomine
luua_hunnik
Vt eespool!
kuhjama
Vt eespool
ühendada
Kui kuhja massiivid,
89, 85, 87, 84, 82, 79, 73, 80, 81,, 65, 69ja
89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71on ühendatud, võib duplikaatideta tulemus olla,
89, 85, 87, 84, 82, 83, 81, 80, 79, 73, 68, 65, 69, 70, 71Pärast mõningast sõelumist. Pange tähele, et esimeses massiivis pole 82 last. Saadud massiivis on indeks 4; ja selle asukohad indeksis 2 (4) + 1 = 9 ja 2 (4) + 2 = 10 on vabad. See tähendab, et tal pole uues puudiagrammis ka lapsi. Kahte algset hunnikut ei tohiks kustutada, kuna nende teave pole uues hunnikus (uus massiiv). Põhitöö algoritm sama tüüpi kuhjade ühendamiseks on järgmine:
- Ühendage üks massiiv teise massiivi põhjaga.
- Heapify kõrvaldab duplikaadid, veendudes, et sõlmedel, millel ei olnud lapsi algsetes kuhjades, ei oleks uues hunnikus veel lapsi.
kokku sulanud
Kahe sama tüüpi (kas kahe max- või kaks min-hunniku) ühendamise algoritm on järgmine:
- Võrrelge kahte juurte sõlme.
- Tehke vähem äärmuslik juur ja ülejäänud selle puu (alampuu), äärmise juure teine laps.
- Sõeluge praeguse äärmise alampuu juure hulkuv laps, äärmises alampuus allapoole.
Saadud hunnik vastab endiselt kuhja omadusele, samas kui algsed kuhjad hävitatakse (kustutatakse). Esialgsed hunnikud võib hävitada, sest kogu nende valduses olev teave on endiselt uues kuhjas.
Hunniku põhitoimingud
find_max (find_min)
See tähendab massiivi max-heap maksimaalse väärtuse leidmist ja koopia tagastamist või massiivi min-heap minimaalse väärtuse leidmist ja koopia tagastamist. Hunniku massiiv määratluse järgi juba rahuldab kuhja omadust. Nii et lihtsalt tagastage massiivi esimese elemendi koopia.
sisestada
See tähendab, et lisage kuhja massiivi uus element ja korraldage massiiv ümber, nii et diagrammi kuhja omadus säiliks (täidetud). Mõlemat tüüpi kuhjade jaoks on algoritm järgmine:
- Oletame, et kahendpuu on täis. See tähendab, et massiiv tuleb vajadusel täita tühjade kohtadega. Täiskuhja sõlmede koguarv on 1, 3 või 7 või 15 või 31 jne.; kahekordistage ja lisage 1.
- Pange sõlm suuruselt kõige sobivamasse tühja kohta, kuhja otsa poole (kuhja massiivi lõpu poole). Kui tühja asukohta pole, siis alustage vasakult allservast uut rida.
- Vajadusel sõeluge üles, kuni kuhja omadus on rahuldatud.
väljavõte_max (väljavõte_min)
Leidke massiivi max-heap maksimaalne väärtus, eemaldage see ja tagastage see; või leidke massiivi min-heap minimaalne väärtus, eemaldage see ja tagastage see. Algväärtus_max (ekstrakt_min) on järgmine:
- Eemaldage juursõlm.
- Võtke (eemaldage) kõige parem parempoolne sõlm (massiivi viimane sõlm) ja asetage juur.
- Sõeluge vajadusel alla, kuni kuhja omadus on rahuldatud.
kustuta_max (kustuta_min)
Leidke max-heap juursõlm, mis on massiivi max-heap esimene element, eemaldage see tingimata tagastamata; või leidke min-kuhja juursõlm, mis on massiivi min-heap esimene element, eemaldage see tingimata tagastamata. Juuresõlme kustutamise algoritm on järgmine:
- Eemaldage juursõlm.
- Võtke (eemaldage) kõige parem parempoolne sõlm (massiivi viimane sõlm) ja asetage juur.
- Sõeluge vajadusel alla, kuni kuhja omadus on rahuldatud.
asendama
Leidke mõlema kuhja juursõlm, eemaldage see ja asendage see uuega. Pole tähtis, kas vana juur tagastatakse. Vajadusel sõeluge alla, kuni kuhja omadus on täidetud.
Sisemised kuhjaoperatsioonid
suurendusklahv (vähenemisklahv)
Suurendage mis tahes sõlme väärtust max-kuhja jaoks ja korraldage ümber nii, et kuhja omadus säiliks, või vähendage mis tahes sõlme väärtust min-kuhja jaoks ja korraldage nii, et kuhja omadus säiliks. Sõeluge vastavalt vajadusele üles või alla, kuni kuhja omadus on rahuldatud.
kustuta
Eemaldage huvipakkuv sõlm, seejärel korraldage ümber, nii et kuhja omadus säiliks max-heap või min-heap jaoks. Sõlme kustutamise algoritm on järgmine:
- Eemaldage huvipakkuv sõlm.
- Võtke (eemaldage) kõige parem parempoolne sõlm (massiivi viimane sõlm) ja asetage eemaldatud sõlme indeks. Kui kustutatud sõlm on viimasel real, siis ei pruugi see vajalik olla.
- Sõeluge vastavalt vajadusele üles või alla, kuni kuhja omadus on täidetud.
shift_up
Liigutage sõlme max-kuhjas või min-kuhjas üles nii kaua kui vaja, korrastage kuhja omaduse säilitamiseks - sõeluge üles.
shift_down
Liigutage sõlme max-kuhjas või min-kuhjas allapoole nii kaua kui vaja, korrastage kuhjaomaduse säilitamiseks - sõeluge alla.
Hunniku ülevaatus
suurus
Vt eespool!
on tühi
Vt eespool!
Muude hunnikute klassid
Selles artiklis kirjeldatud kuhja võib pidada peamiseks (üldiseks) kuhjaks. Hunnikuid on teisigi. Kaks, mida peaksite sellest kaugemale teadma, on kahendhunnik ja d-arüühunnik.
Binaarne hunnik
Binaarhunnik on sarnane selle peahunnikuga, kuid rohkem piirangutega. Eelkõige peab binaarhunnik olema täielik puu. Ärge ajage segamini täieliku puu ja täis puu vahel.
d-ary Heap
Binaarne hunnik on 2-aariline hunnik. Hunnik, kus igal sõlmel on 3 last, on 3-aariline hunnik. Hunnik, kus igal sõlmel on 4 last, on 4-aariline hunnik jne. D-ary hunnikul on muid piiranguid.
Järeldus
Hunnik on täielik või peaaegu täielik binaarne puu, mis rahuldab kuhja omadust. Hunniku omadusel on 2 alternatiivi: max-kuhja jaoks peab vanem olema võrdne või suurem väärtusest kui vahetud lapsed; min-kuhja jaoks peab vanema väärtus olema võrdne või väiksem kui vahetutel lastel. Hunnikut võib kujutada puu või massiivina. Massiivis esindatuna on juursõlm massiivi esimene sõlm; ja kui sõlm asub indeksis n, on selle massiivi esimene indeks indeksis 2n + 1 ja järgmine laps indeksis 2n + 2. Hunnikul on teatud massiivil tehtavad toimingud.
Chrys