Podatkovne strukture in algoritmi

Vadnica za strukturo podatkov o kopici

Vadnica za strukturo podatkov o kopici
Podatki so nabor vrednosti. Podatke lahko zberemo in postavimo v vrstico ali v stolpec, v tabelo ali v obliki drevesa. Struktura podatkov ni le umestitev podatkov v katero koli od teh oblik. Pri računalništvu je podatkovna struktura kateri koli od teh formatov, plus razmerje med vrednostmi in operacije (funkcije), ki se izvajajo na vrednostih. Preden pridete sem, bi morali že imeti osnovno znanje o strukturi drevesnih podatkov, saj bodo tamkajšnji koncepti uporabljeni z malo ali nič razlage. Če tega znanja nimate, preberite vadnico z naslovom Vodič za strukturo drevesnih struktur za začetnike na povezavi https: // linuxhint.com / tree_data_structure_tutorial_beginners /. Po tem nadaljujte z branjem te vadnice.Struktura podatkov kopice je popolno ali skoraj popolno binarno drevo, pri čemer je podrejeno posamezno vozlišče po vrednosti enako ali manjše od vrednosti njegovega nadrejenega. Druga možnost je takšno drevo, pri katerem je vrednost starša enaka ali manjša od vrednosti katerega koli njenega otroka. Vrednost (datum) drevesa se imenuje tudi ključ.

Prikaz struktur podatkov o kopici

Obstajata dve vrsti kupčkov: največja in najmanjša. Struktura max-heap je največja vrednost koren, vrednosti pa postanejo manjše, ko se drevo spusti; kateri koli od staršev je bodisi enak ali večji kot kateri koli od njegovih neposrednih otrok. Struktura min-heap je tam, kjer je najmanjša vrednost koren, vrednosti pa postanejo večje s spuščanjem drevesa; kateri koli starš je po vrednosti enak ali manjši od katerega koli od njegovih neposrednih otrok. V naslednjih diagramih je prva največja količina, druga pa minimalna kopica:

Pri obeh kupih bodite pozorni, da za par otrok ni pomembno, ali je tisti na levi večja vrednost. Vrstice v ravni na drevesu ni nujno zapolniti od najmanjše do največje leve; ni nujno tudi napolnjen od največjega do najmanjšega, od leve strani.

Predstavljanje kupa v matriki

Da programska oprema lahko preprosto uporablja kup, mora biti kup predstavljen v matriki. Zgornja največja kopica, predstavljena v matriki, je:

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

To se naredi s korensko vrednostjo kot prvo vrednostjo polja. Vrednosti neprekinjeno postavljamo tako, da drevo beremo od leve proti desni, od zgoraj navzdol. Če element ni prisoten, se njegov položaj v matriki preskoči. Vsako vozlišče ima dva otroka. Če je vozlišče na indeksu (položaju) n, je njegov prvi podrejeni element v matriki na indeksu 2n + 1, njegov naslednji podrejeni pa na indeksu 2n + 2. 89 je pri indeksu 0; njen prvi otrok je 85 pri indeksu 2 (0) + 1 = 1, drugi otrok pa pri indeksu 2 (0) + 2 = 2. 85 je pri indeksu 1; njen prvi otrok 84 je pri indeksu 2 (1) + 1 = 3, drugi otrok 82 pa pri indeksu 2 (1) + 2 = 4. 79 je pri indeksu 5; njen prvi otrok je 65 pri indeksu 2 (5) + 1 = 11, drugi otrok pa pri indeksu 2 (5) + 2 = 12. Formule se uporabijo za ostale elemente v matriki.

Takšna matrika, kjer pomen elementa in razmerje med elementi implicira položaj elementa, se imenuje implicitna struktura podatkov.

Implicitna podatkovna struktura za zgornji min-heap je:

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

Zgornji max-heap je popolno binarno drevo, ne pa tudi polno binarno drevo. Zato so nekatere lokacije (položaji) v polju prazne. Za polno binarno drevo nobena lokacija v polju ne bo prazna.

Zdaj, če bi bila kopica skoraj popolno drevo, če bi na primer manjkala vrednost 82, bi bila matrika:

89, 85, 87, 84,, 79, 73, 80, 81,,, 65, 69

V tem primeru so tri lokacije prazne. Vendar pa so formule še vedno uporabne.

Operacije

Podatkovna struktura je oblika podatkov (npr.g. drevo), plus razmerje med vrednostmi in operacije (funkcije), ki se izvajajo na vrednostih. Za kup je razmerje, ki poteka skozi celo kup, da mora biti starš enak ali večji kot otroci, za največ kup; starš pa mora biti min-kup enak ali manj vreden kot otroci. To razmerje se imenuje lastnost kopice. Operacije kopice so razvrščene pod naslove Ustvarjanje, Osnovno, Interno in Pregled. Sledi povzetek operacij kupa:

Povzetek operacij kopice

Obstajajo nekatere operacije programske opreme, ki so skupne kupom, kot sledi:

Ustvarjanje kupa

create_heap: Ustvarjanje kopice pomeni oblikovanje predmeta, ki predstavlja kup. V jeziku C lahko ustvarite kopico z vrsto predmeta struct. Eden od članov strukture bo matrika kopice. Preostali člani bodo funkcije (operacije) za kup. Create_heap pomeni ustvariti prazen kup.

Heapify: Polje kopice je delno razvrščeno (urejeno) polje. Heapify pomeni, iz nesortirane matrike dodajte matrico kopice - glejte podrobnosti spodaj.

Združi: To pomeni, da iz dveh različnih kup ustvarite združen kup - glejte podrobnosti spodaj. Oba kupčka morata biti največja ali oba najmanjša. Nova kopica je skladna z lastnostjo kopice, medtem ko se prvotne kopice ohranijo (ne izbrišejo).

Meld: To pomeni, da združite dve kopici iste vrste, da tvorite novo, pri čemer ohranite dvojnike - glejte podrobnosti spodaj. Nova kopica je v skladu z lastnostjo kopice, medtem ko je prvotna kopica uničena (izbrisana). Glavna razlika med združevanjem in združevanjem je v tem, da se za spajanje eno drevo kot poddrevo prilega korenu drugega drevesa, kar omogoča podvojene vrednosti v novem drevesu, medtem ko se za spajanje oblikuje novo drevo kopice in odstrani dvojnike. Ni treba vzdrževati dveh originalnih kupčkov z mešanjem.

Osnovne operacije kopičenja

find_max (find_min): poiščite največjo vrednost v polju max-heap in vrnite kopijo ali poiščite najmanjšo vrednost v matriki min-heap in vrnite kopijo.

Vstavi: v matriko kopice dodajte nov element in matriko preuredite tako, da se ohrani lastnost kopice diagrama.

extract_max (extract_min): poiščite največjo vrednost v polju max-heap, jo odstranite in vrnite; ali poiščite najmanjšo vrednost v polju min-heap, jo odstranite in vrnite.

delete_max (delete_min): poiščite korensko vozlišče max-heap, ki je prvi element matrike max-heap, odstranite ga, ne da bi ga morali vrniti; ali poiščite korensko vozlišče min-heap, ki je prvi element matrike min-heap, ga odstranite, ne da bi ga nujno vrnili;

Zamenjava: poiščite korensko vozlišče obeh kopij, ga odstranite in zamenjajte z novim. Ni pomembno, ali se vrne stari koren.

Notranje kopičenje

Povečaj_ključ (Zmanjšaj_Ključ): Povečajte vrednost katerega koli vozlišča za največjo kopico in prerazporedite, tako da se ohrani lastnost kopice, ali zmanjšajte vrednost katerega koli vozlišča za najmanjšo kopico in preuredite tako, da se lastnost kopice ohrani.

Delete: izbrišite katero koli vozlišče, nato preuredite, tako da se lastnost kopice ohrani za max-heap ali min-heap.

shift_up: premaknite vozlišče navzgor v max-heap ali min-heap toliko časa, kolikor je potrebno, preuredite, da ohranite lastnost kopice.

shift_down: premaknite vozlišče navzdol v max-heap ali min-heap toliko časa, kolikor je potrebno, preuredite, da ohranite lastnost kopice.

Pregled kupa

Velikost: To vrne število ključev (vrednosti) v kopici; ne vključuje praznih mest polja kopice. Kup je lahko predstavljen s kodo, kot je v diagramu, ali z matriko.

je prazno: To vrne logično vrednost true, če na kopici ni vozlišča, ali logično vrednost false, če ima kup vsaj eno vozlišče.

Presejanje na kup

Obstaja presejanje in presejanje:

Prebiranje: To pomeni zamenjavo vozlišča s staršem. Če lastnost kopice ni zadovoljena, zamenjajte nadrejenega z lastnim nadrejenim. Nadaljujte po tej poti, dokler lastnost kopice ni zadovoljena. Postopek lahko doseže koren.

Sift-Down: To pomeni, da vozlišče velike vrednosti zamenjate z manjšim od njegovih dveh podrejenih (ali enim otrokom za skoraj celoten kup). Če lastnost kopice ni zadovoljena, zamenjajte spodnje vozlišče z manjšim vozliščem njegovih dveh podrejenih. Nadaljujte po tej poti, dokler lastnost kopice ni zadovoljena. Postopek lahko doseže list.

Oteževalno

Heapify pomeni razvrstiti nerazvrščeno matriko, da bo lastnost kopice zadovoljena za max-heap ali min-heap. To pomeni, da je v novi matriki morda nekaj praznih mest. Osnovni algoritem za kopičenje max-heap ali min-heap je naslednji:

- če je korensko vozlišče bolj skrajno od katerega koli otrokovega vozlišča, potem koren zamenjajte z manj ekstremnim podrejenim vozliščem.

- Ponovite ta korak z otroškimi vozlišči v shemi za prehod drevesa prednaročil.

Končno drevo je drevo kopice, ki izpolnjuje lastnost kopice. Kup je lahko predstavljen kot drevesni diagram ali v matriki. Nastala kopica je delno razvrščeno drevo, tj.e. delno razvrščeno polje.

Podrobnosti o kopičenju

Ta odsek članka vsebuje podrobnosti o operacijah kopičenja.

Ustvarjanje podrobnosti kupa

create_heap

Glej zgoraj!

Heapify

Glej zgoraj

združiti

Če je kopica nizov,

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

in

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

so združeni, je lahko rezultat brez dvojnikov,

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

Po nekaj presejanju. Upoštevajte, da v prvem polju 82 nima otrok. V dobljenem polju je indeks 4; in njene lokacije pri indeksu 2 (4) + 1 = 9 in 2 (4) + 2 = 10 so proste. To pomeni, da v novem drevesnem diagramu tudi nima otrok. Izvirnih dveh kupčkov ne smete izbrisati, ker njihovih podatkov v resnici ni na novem kupu (novo polje). Osnovni algoritem za združevanje kup iste vrste je naslednji:

- Pridružite eno polje na dno drugega polja.

- Heapify odstranjuje dvojnike in zagotavlja, da vozlišča, ki niso imela otrok v prvotnih kopicah, še vedno nimajo otrok na novem kupu.

meld

Algoritem za spajanje dveh kup iste vrste (bodisi dve največji ali dve min-) je naslednji:

- Primerjajte dve korenski vozlišči.

- Naredite manj skrajno korenino in ostalo drevo (poddrevo), drugega otroka skrajnega korena.

- Presejte potepuškega otroka korenine zdaj skrajnega poddrevesa navzdol v skrajno poddrevo.

Nastala kopica je še vedno v skladu z lastnostjo kopice, medtem ko so prvotne kopice uničene (izbrisane). Prvotne kupe je mogoče uničiti, ker so vse informacije, ki jih imajo, še vedno na novem kupu.

Osnovne operacije kopičenja

najdi_max (najdi_min)

To pomeni poiskati največjo vrednost v matriki max-heap in vrniti kopijo ali najti najmanjšo vrednost v matriki min-heap in vrniti kopijo. Polje kopice po definiciji že izpolnjuje lastnost kopice. Torej, vrnite kopijo prvega elementa polja.

vstavi

To pomeni, da v matriko kopice dodate nov element in matriko preuredite tako, da se ohrani lastnost kopice diagrama (zadovoljeno). Algoritem za to za obe vrsti kup je naslednji:

- Predpostavimo polno binarno drevo. To pomeni, da je treba matriko na koncu napolniti s praznimi mesti, če je to potrebno. Skupno število vozlišč celotne kopice je 1 ali 3 ali 7 ali 15 ali 31 itd.; nadaljujte z podvajanjem in dodajanjem 1.

- Vozlišče postavite na najprimernejše prazno mesto po velikosti, proti koncu kupa (proti koncu polja kopice). Če ni praznega mesta, zaženite novo vrstico spodaj levo.

- Po potrebi presejte, dokler lastnost kopice ni zadovoljena.

izvleček_max (izvleček_min)

Poiščite največjo vrednost v matriki max-heap, jo odstranite in vrnite; ali poiščite najmanjšo vrednost v polju min-heap, jo odstranite in vrnite. Algoritem za ekstrakcijo_max (ekstrakt_min) je naslednji:

- Odstranite korensko vozlišče.

- Vzemite (odstranite) spodnje desno vozlišče (zadnje vozlišče v matriki) in ga postavite v koren.

- Po potrebi presejte, dokler lastnost kopice ni zadovoljena.

delete_max (delete_min)

Poiščite korensko vozlišče max-heap, ki je prvi element matrike max-heap, odstranite ga, ne da bi ga morali vrniti; ali poiščite korensko vozlišče min-heap, ki je prvi element matrike min-heap, ga odstranite, ne da bi ga morali vrniti. Algoritem za brisanje korenskega vozlišča je naslednji:

- Odstranite korensko vozlišče.

- Vzemite (odstranite) spodnje desno vozlišče (zadnje vozlišče v matriki) in ga postavite v koren.

- Po potrebi presejte, dokler lastnost kopice ni zadovoljena.

zamenjati

Poiščite korensko vozlišče katerega koli kupa, ga odstranite in zamenjajte z novim. Ni pomembno, ali se vrne stari koren. Po potrebi presejte, dokler lastnost kopice ni zadovoljena.

Notranje kopičenje

povečaj_ključ (zmanjšaj_ključ)

Povečajte vrednost katerega koli vozlišča za največjo kopico in prerazporedite, tako da se ohrani lastnost kopice, ali zmanjšajte vrednost katerega koli vozlišča za min-kopico in preuredite tako, da se ohrani lastnost kopice. Po potrebi presejte navzgor ali navzdol, dokler ni izpolnjena lastnost kopice.

izbriši

Odstranite vozlišče, ki vas zanima, nato prerazporedite, tako da se lastnost kopice ohrani za max-heap ali min-heap. Algoritem za brisanje vozlišča je naslednji:

- Odstranite vozlišče, ki vas zanima.

- Vzemite (odstranite) skrajno desno vozlišče (zadnje vozlišče v matriki) in postavite na indeks odstranjenega vozlišča. Če je vozlišče izbrisano v zadnji vrstici, potem to morda ne bo potrebno.

- Po potrebi presejte navzgor ali navzdol, dokler ni izpolnjena lastnost kopice.

shift_up

Premaknite vozlišče navzgor v največji kup ali najmanjši kup toliko časa, kolikor je potrebno, preuredite, da ohranite lastnost kopice - presejte.

shift_down

Premaknite vozlišče navzdol v max-heap ali min-heap toliko časa, kolikor je potrebno, preuredite, da ohranite lastnost kopice - presejte dol.

Pregled kupa

velikost

Glej zgoraj!

je prazno

Glej zgoraj!

Drugi razredi kupe

Kup, opisan v tem članku, lahko štejemo za glavni (splošni) kup. Obstajajo tudi druge vrste kup. Dve, ​​ki bi jih morali vedeti poleg tega, sta Binarni kup in d-arni kup.

Binarni kup

Binarna kopica je podobna tej glavni kopici, vendar z več omejitvami. Binarna kopica mora biti celotno drevo. Ne mešajte med popolnim in polnim drevesom.

d-arni kup

Binarna kopica je 2-ary kup. Kup, kjer ima vsako vozlišče po 3 otroke, je 3-ary heap. Kup, kjer ima vsako vozlišče 4 otroke, je 4-ary kup itd. D-arna kopica ima druge omejitve.

Zaključek

Kup je popolno ali skoraj popolno binarno drevo, ki izpolnjuje lastnost kopice. Lastnost kopice ima dve možnosti: za max-heap mora biti starš po vrednosti enak ali večji od neposrednih otrok; za min-kup mora biti starš enak ali manj vreden kot neposredni otroci. Kup je lahko predstavljen kot drevo ali v matriki. Ko je korensko vozlišče predstavljeno v matriki, je prvo vozlišče polja; in če je vozlišče v indeksu n, je njegov prvi podrejeni element v matriki indeks 2n + 1, njegov naslednji podrejeni pa v indeksu 2n + 2. Kup ima določene operacije, ki se izvajajo na matriki.

Chrys

Uporabna orodja za igralce Linux
Če radi igrate igre na Linuxu, obstaja verjetnost, da ste za izboljšanje igralne izkušnje uporabljali aplikacije in pripomočke, kot so Wine, Lutris in...
HD Remastered Games za Linux, ki prej še niso izdale Linuxa
Mnogi razvijalci iger in založniki pripravijo HD remaster starih iger, da podaljšajo življenjsko dobo franšize, zato oboževalci zahtevajo združljivost...
Kako uporabljati AutoKey za avtomatizacijo iger Linux
AutoKey je namizni pripomoček za avtomatizacijo za Linux in X11, programiran v Python 3, GTK in Qt. Z njegovo funkcijo skriptiranja in MACRO lahko avt...