Illustrasjon av HAP -datastrukturer
Det er to typer hauger: en maksimal og en min-heap. En maksimal struktur er der maksimalverdien er roten, og verdiene blir mindre etter hvert som treet er avstammet; Enhver forelder er enten lik eller større i verdi enn noen av de umiddelbare barna. En min-heap-struktur er der minimumsverdien er roten, og verdiene blir større etter hvert som treet er avstammet; Enhver forelder er enten lik eller mindre i verdi enn noen av de umiddelbare barna. I de følgende diagrammer er det første en maksimal og den andre er en min-heap:
For begge hauger, legg merke til at det for et par barn ikke spiller noen rolle om den til venstre er den større verdien. En rad i et nivå i treet, må ikke nødvendigvis fylles fra minimum til maksimum, fra venstre; Det er ikke nødvendigvis fylt fra maksimum til minimum, fra venstre.
Representerer en haug i en matrise
For at programvare enkelt skal bruke en haug, må haugen være representert i en matrise. Max-heap ovenfor, representert i en matrise er:
89, 85, 87, 84, 82, 79, 73, 80, 81 ,,, 65, 69Dette gjøres fra og med rotverdien som den første verdien for matrisen. Verdiene plasseres kontinuerlig ved å lese treet fra venstre til høyre, fra topp til bunn. Hvis et element er fraværende, blir dens posisjon i matrisen hoppet over. Hver node har to barn. Hvis en node er i indeks (posisjon) n, er det første barnet i matrisen ved indeks 2n+1, og dets neste barn er ved indeks 2n+2. 89 er ved indeks 0; Det første barnet, 85 er ved indeks 2 (0)+1 = 1 mens det andre barnet er ved indeks 2 (0)+2 = 2. 85 er ved indeks 1; Det første barnet, 84, er ved indeks 2 (1)+1 = 3 mens det andre barnet, 82 er ved indeks 2 (1)+2 = 4. 79 er ved indeks 5; Det første barnet, 65 er ved indeks 2 (5)+1 = 11 mens det andre barnet er ved indeks 2 (5)+2 = 12. Formlene brukes på resten av elementene i matrisen.
En slik rekke, der betydningen av et element og forholdet mellom elementene, antydes av elementets plassering, kalles en implisitt datastruktur.
Den implisitte datastrukturen for ovennevnte min-heap er:
65, 68, 70, 73, 71, 83, 84 ,,, 79, 80 ,, 85, 89Ovennevnte max-heap er et komplett binært tre, men ikke et fullt binært tre. Det er grunnen til at noen steder (posisjoner) er tomme i matrisen. For et fullt binært tre vil ingen beliggenhet være tomt i matrisen.
Hvis haugen var et nesten komplett tre, for eksempel, hvis verdien 82 manglet, ville matrisen være:
89, 85, 87, 84, 79, 73, 80, 81 ,,, 65, 69I denne situasjonen er tre steder tomme. Imidlertid er formlene fortsatt anvendelige.
Operasjoner
En datastruktur er et format av data (e.g. et tre), pluss forholdet mellom verdiene, pluss operasjonene (funksjonene) utfører på verdiene. For en haug er forholdet som går gjennom hele haugen, at forelderen må være like eller større i verdi enn barna, for en maksimal hau; og forelderen må være like eller mindre i verdi enn barna, for en mineap. Dette forholdet kalles Heap -eiendommen. Operasjon av en haug er gruppert under skaperverdiene, grunnleggende, interne og inspeksjonen. Et sammendrag av driften av haugen følger:
HAP -operasjonssammendrag
Det er visse programvareoperasjoner som er vanlige med hauger, som følger:
Opprettelse av en haug
Create_heap: Å lage en haug betyr å danne et objekt som representerer haugen. På C -språket kan du opprette en haug med Struct Object -typen. Et av medlemmene i strukturen vil være Heap -matrisen. Resten av medlemmene vil være funksjoner (operasjoner) for haugen. Create_heap betyr å lage en tom haug.
Heapify: Heap -arrayen er en delvis sortert (bestilt) matrise. Heapify betyr, gi en haug -matrise fra en usortert matrise - se detaljer nedenfor.
Fusjon: Dette betyr, danner en unions haug fra to forskjellige hauger - se detaljer nedenfor. De to dyngene skal begge være maksimal eller begge min-heap. Den nye haugen er i samsvar med Heap -eiendommen, mens de opprinnelige dyngene er bevart (ikke slettet).
MELD: Dette betyr, bli med to hauger av samme type for å danne en ny, vedlikeholde duplikater - se detaljer nedenfor. Den nye haugen er i samsvar med Heap -eiendommen, mens de opprinnelige hauene blir ødelagt (slettet). Hovedforskjellen mellom sammenslåing og smelting er at for smelting passer ett tre som en undertrekk til roten til det andre treet, slik at duplikatverdier i det nye treet, mens for sammenslåing dannes et nytt haupertre, og fjerner duplikater. Det er ikke nødvendig å opprettholde de to originale dyngene med smelting.
Grunnleggende haugoperasjoner
find_max (find_min): Finn maksimalverdien i max-heap-arrayen og returner en kopi, eller finn minimumsverdien i min-heap-matrisen og returner en kopi.
Sett inn: Legg til et nytt element i HAP -matrisen, og omorganiserer matrisen slik at diagrammets haugegenskap blir opprettholdt.
EXTRACT_MAX (EXTRACT_MIN): Finn maksimalverdien i Max-Heap-arrayen, fjern og returner den; eller finn minimumsverdien i min-heap-matrisen, fjern og returner den.
Delete_max (Delete_min): Finn rotnoden til en Max-Heap, som er det første elementet i Max-Heap-matrisen, fjern den uten nødvendigvis å returnere den; eller finn rotnoden til en min-heap, som er det første elementet i min-heap-arrayen, fjern den uten nødvendigvis å returnere den;
Erstatt: Finn rotnoden til en av haugene, fjern den og erstatt den med en ny. Det spiller ingen rolle om den gamle roten blir returnert.
Intern heapoperasjoner
øke_key (reduksjon_key): Øk verdien av en hvilken som helst node for en maksimal og omorganiserer slik at heapegenskapen opprettholdes, eller reduser verdien av en node for en min-heap og omorganiserer slik at heapegenskapen opprettholdes.
Slett: Slett en hvilken som helst node, deretter omorganiser, slik at heapegenskapen opprettholdes for max-heap eller en min-heap.
Shift_up: Flytt en node opp i en maksimal eller min-heap så lenge som nødvendig, og omorganiser for å opprettholde Heap-eiendommen.
Shift_down: Flytt en node ned i en maksimal eller min-heap så lenge som nødvendig, og omorganiser for å opprettholde Heap-eiendommen.
Inspeksjon av en haug
Størrelse: Dette returnerer antall nøkler (verdier) i en haug; Det inkluderer ikke de tomme plasseringene av Heap -matrisen. En haug kan være representert med kode, som i diagrammet, eller med en matrise.
er tom: Dette returnerer boolsk sann hvis det ikke er noen node i en haug, eller boolsk falsk hvis haugen har minst en node.
Sift i en haug
Det er sikt opp og sile ned:
Sift-up: Dette betyr å bytte en node med foreldrene. Hvis Heap -eiendommen ikke er fornøyd, bytter du foreldrene med sin egen forelder. Fortsett denne veien i banen til Heap -eiendommen er fornøyd. Prosedyren kan nå roten.
Sift-down: Dette betyr å bytte en node med stor verdi med den mindre av de to barna (eller ett barn for en nesten fullstendig haug). Hvis Heap -egenskapen ikke er fornøyd, bytter du den nedre noden med den mindre noden til sine egne to barn. Fortsett denne veien i banen til Heap -eiendommen er fornøyd. Prosedyren kan nå et blad.
Hauger
Heapify betyr å sortere en usortert matrise for å ha Heap-eiendommen fornøyd for maksimal eller min-heap. Dette betyr at det kan være noen tomme steder i den nye matrisen. Den grunnleggende algoritmen for å ha en maksimal eller min-heap er som følger:
- Hvis rotnoden er mer ekstrem enn noen av barnets node, kan du bytte roten med den mindre ekstreme barneknuten.
- Gjenta dette trinnet med barneknuter i et forhåndsbestill tre som krysser ordningen.
Det endelige treet er et høstre som tilfredsstiller Heap -eiendommen. En haug kan bli representert som et trediagram eller i en matrise. Den resulterende haugen er et delvis sortert tre, jeg.e. en delvis sortert matrise.
DETALJERINGER
Denne delen av artikkelen gir detaljer om haugoperasjonene.
Opprettelse av en haugdetaljer
create_heap
Se ovenfor!
Heapify
Se ovenfor
slå sammen
Hvis haugene er,
89, 85, 87, 84, 82, 79, 73, 80, 81 ,,, 65, 69og
89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71blir slått sammen, resultatet uten duplikater kan være,
89, 85, 87, 84, 82, 83, 81, 80, 79 ,, 73, 68, 65, 69, 70, 71Etter litt sikt. Legg merke til at i den første matrisen har 82 ingen barn. I den resulterende matrisen er det ved indeks 4; og plasseringen av indeks 2 (4)+1 = 9 og 2 (4)+2 = 10 er ledige. Dette betyr at det heller ikke har barn i det nye trediagrammet. De originale to hauger skal ikke slettes siden informasjonen ikke egentlig er i den nye haugen (ny matrise). Den grunnleggende algoritmen for å slå sammen hauger av samme type er som følger:
- Bli med på den ene matrisen til bunnen av den andre matrisen.
- Heapify eliminerer duplikater, og sørger for at noder som ikke hadde barn i den opprinnelige haugen, fremdeles ikke har barn i den nye haugen.
Meld
Algoritmen for å smelte sammen to hauger av samme type (enten to max- eller to min-) er som følger:
- Sammenlign de to rotnodene.
- Lag den mindre ekstreme rot og resten av treet (subtree), det andre barnet av den ekstreme roten.
- Sikt det omstreifende barnet til roten til nå den ekstreme undertrekk, nedover i ekstreme undertree.
Den resulterende haugen er fremdeles i samsvar med Heap -eiendommen, mens de opprinnelige dyngene blir ødelagt (slettet). De originale dyngene kan bli ødelagt fordi all informasjonen de hadde fremdeles er i den nye haugen.
Grunnleggende haugoperasjoner
find_max (find_min)
Dette betyr å lokalisere maksimalverdien i max-heap-matrisen og returnere en kopi, eller finne minimumsverdien i min-heap-matrisen og returnere en kopi. En haugesett per definisjon tilfredsstiller allerede Heap -eiendommen. Så bare returner en kopi av det første elementet i matrisen.
sett inn
Dette betyr å legge til et nytt element i Heap -matrisen, og omorganisere matrisen slik at diagrammets haugegenskap opprettholdes (fornøyd). Algoritmen for å gjøre dette for begge typer hauger er som følger:
- Anta et fullt binært tre. Dette betyr at matrisen må fylles på slutten med tomme steder om nødvendig. Det totale antallet noder av en full haug er 1, eller 3 eller 7 eller 15 eller 31 osv.; fortsett å doble og legge til 1.
- Sett noden på det mest passende tomme stedet etter størrelsesorden, mot slutten av haugen (mot slutten av heap -arrayen). Hvis det ikke er noen tom plassering, så start en ny rad nederst til venstre.
- Sikt opp om nødvendig, til Heap -eiendommen er fornøyd.
Extract_Max (Extract_min)
Finn den maksimale verdien i Max-Heap-matrisen, fjern og returner den; eller finn minimumsverdien i min-heap-matrisen, fjern og returner den. Algoritmen til Extract_max (Extract_min) er som følger:
- Fjern rotnoden.
- Ta (fjern) den nederste til høyre noden (siste node i matrisen) og legg ved roten.
- Sikt ned etter behov, til Heap -eiendommen er fornøyd.
delete_max (Delete_min)
Finn rotnoden til en max-heap, som er det første elementet i max-heap-arrayen, fjern den uten nødvendigvis å returnere den; eller finn rotnoden til en min-heap, som er det første elementet i min-heap-matrisen, fjern den uten nødvendigvis å returnere den. Algoritmen for å slette rotnoden er som følger:
- Fjern rotnoden.
- Ta (fjern) den nederste til høyre noden (siste node i matrisen) og legg ved roten.
- Sikt ned etter behov, til Heap -eiendommen er fornøyd.
erstatte
Finn rotnoden til en av haugene, fjern den og erstatt den med den nye. Det spiller ingen rolle om den gamle roten blir returnert. Sikt ned hvis det er aktuelt, til Heap -eiendommen er fornøyd.
Intern heapoperasjoner
øke_key (reduksjon_key)
Øk verdien av en hvilken som helst node for en maksimal og omorganiserer slik at Heap-egenskapen opprettholdes, eller reduser verdien av en hvilken som helst node for en min-heap og omorganiserer slik at Heap-egenskapen opprettholdes. Sikt opp eller ned etter behov, til Heap -eiendommen er fornøyd.
slett
Fjern noden av interesse, deretter omorganiser, slik at Heap-eiendommen opprettholdes for maksimalen eller en min-heap. Algoritmen for å slette en node er som følger:
- Fjern interessen for interesse.
- Ta (fjern) den nederste til høyre noden (siste node i matrisen) og legg ved indeksen for noden fjernet. Hvis noden som er slettet er på siste rad, kan det hende at dette ikke er nødvendig.
- Sikt opp eller ned etter behov, til Heap -eiendommen er fornøyd.
gire opp
Flytt en node opp i en max-heap eller min-heap så lenge som nødvendig, og omorganiser for å opprettholde Heap-eiendommen-sikt opp.
Gir ned
Flytt en node ned i en max-heap eller min-heap så lenge som nødvendig, og omorganiser for å opprettholde Heap-eiendommen-SIFT ned.
Inspeksjon av en haug
størrelse
Se ovenfor!
er tom
Se ovenfor!
Andre klasser av hauger
Heapen beskrevet i denne artikkelen kan betraktes som hoved (generell) haug. Det er andre klasser av hauger. Imidlertid er de to som du bør vite utover dette, den binære haugen og D-Aar-haugen.
Binær haug
Den binære haugen ligner på denne viktigste haugen, men med flere begrensninger. Spesielt må den binære haugen være et komplett tre. Ikke forveksle mellom et komplett tre og et fullt tre.
d-ary haug
En binær haug er en 2-ary haug. En haug der hver node har 3 barn er en 3-ary haug. En haug der hver node har 4 barn er en 4-ary haug, og så videre. En d-ary haug har andre begrensninger.
Konklusjon
En haug er et komplett eller nesten komplett binært tre, som tilfredsstiller Heap -eiendommen. Heap-eiendommen har 2 alternativer: For en maksimal må en forelder være like eller større i verdi enn de umiddelbare barna; For en min-heap må en forelder være like eller mindre i verdi enn de umiddelbare barna. En haug kan bli representert som et tre eller i en matrise. Når den er representert i en matrise, er rotnoden den første noden til matrisen; Og hvis en node er ved indeks n, er det første barnet i matrisen ved indeks 2n+1 og dets neste barn er ved indeks 2n+2. En haug har visse operasjoner som utføres på matrisen.
Chrys