Andmestruktuurid ja algoritmid

Hunniku andmete struktuuri õpetus

Hunniku andmete struktuuri õpetus
Andmed on väärtuste kogum. Andmeid saab koguda ja panna ritta või veergu, tabelisse või puu kujul. Andmete struktuur ei ole ainult andmete paigutamine mis tahes nimetatud vormis. Arvutamisel on andmestruktuur ükskõik milline neist vormingutest, millele lisandub suhe väärtuste vahel, pluss väärtustele tehtavad toimingud (funktsioonid). Enne siia tulekut peaksite juba omama põhiteadmisi puuandmete struktuuri kohta, kuna sealseid mõisteid kasutatakse siin vähe või üldse mitte. Kui teil pole neid teadmisi, lugege lingil https: // linuxhint õpetust Puude andmete struktuuri õpetus algajatele.com / tree_data_structure_tutorial_beginners /. Pärast seda jätkake selle õpetuse lugemist.Hunniku andmestruktuur on täielik või peaaegu täielik binaarne puu, kus iga sõlme laps on väärtusega võrdne või väiksem kui tema vanema väärtus. Teise võimalusena on see selline puu, kus vanema väärtus on võrdne või väiksem kui mõne tema lapse väärtus. Puu väärtust (nullpunkti) nimetatakse ka võtmeks.

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, 69

Seda 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, 69

Selles 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, 69

ja

89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71

on ühendatud, võib duplikaatideta tulemus olla,

89, 85, 87, 84, 82, 83, 81, 80, 79, 73, 68, 65, 69, 70, 71

Pä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

Parimad Linuxi mängukonsooli emulaatorid
Selles artiklis loetletakse Linuxi jaoks saadaval olev populaarne mängukonsooli emuleerimise tarkvara. Emuleerimine on tarkvara ühilduvuse kiht, mis j...
Parimad mängude jaoks mõeldud Linuxi distrod 2021. aastal
Linuxi operatsioonisüsteem on oma algsest, lihtsast, serveripõhisest välimusest kaugele jõudnud. See operatsioonisüsteem on viimastel aastatel tohutul...
Kuidas Linuxis oma mänguseanssi jäädvustada ja voogesitada
Varem peeti mängude mängimist ainult hobiks, kuid aja jooksul kasvas mängutööstus tehnoloogia ja mängijate arvu osas tohutult. Mängupublik on veebimän...