Inom datavetenskap är en heap en specialiserad datastruktur av den trädtyp som uppfyller heap- egenskapen: om B är en undernod till nod A , då key( A ) ≥ key( B ). Det följer att elementet med den största nyckeln alltid är rotnoden för högen, så ibland kallas sådana högar max-högar (alternativt, om jämförelsen är omvänd, kommer det minsta elementet alltid att vara rotnoden, sådana högar kallas min-högar ). Det finns ingen begränsning för hur många barnnoder varje högnod har, även om detta antal i praktiken vanligtvis inte är fler än två. Högen är den mest effektiva implementeringen av en abstrakt datatyp som kallas en prioritetskö . Heaps är avgörande i vissa effektiva grafalgoritmer , som Dijkstras algoritm för d- heaps och heapsort .
Högdatastrukturen ska inte förväxlas med begreppet en heap i dynamisk minnesallokering . Termen användes först specifikt för datastrukturer. Några tidiga populära programmeringsspråk som LISP tillhandahöll dynamisk minnesallokering med hjälp av "heap" datastrukturen, som gav sitt namn till den tilldelade mängden minne. [1] .
Högar implementeras vanligtvis som arrayer, vilket eliminerar behovet av pekare mellan dess element.
Följande operationer utförs vanligtvis på högar:
Nedan finns uppskattningar av tidskomplexiteten för beräkningar för operationer på vissa typer av högar. [1] Där ett värde är markerat med en asterisk baseras uppskattningen på amorteringsanalys (sämsta tidpunkt), annars är uppskattningen ett vanligt värsta fall. O(F) ger en asymptotisk övre gräns, och Θ(F) är en asymptotiskt exakt uppskattning (se notationen "O" stor och "o" liten ). Operationsnamnen väljs för min-högen.
(*) Amorteringstid
(**) Där n är storleken på den största högen
Observera att "Brodals kö" är en implementering av en parallell prioritetskö utvecklad av en grupp ledd av Gert Brodal. [3]
Högdatastrukturer har många användningsområden.
En komplett och nästan komplett binär hög kan representeras på ett mycket effektivt sätt med hjälp av en indexmatris . Det första (eller sista) elementet kommer att innehålla roten. De följande två elementen i arrayen innehåller rotens undernoder. De nästa fyra elementen innehåller fyra barn från två noder som är barn till roten osv. Således kommer barnen i nivånoden natt vara placerade vid positioner 2noch 2n+1för en array indexerad från en, eller vid positioner 2n+1och 2n+2för en array indexerad från noll. Detta gör att du kan flytta upp eller ner i trädet genom att göra enkla arrayindexberäkningar. Högbalansering görs genom att omarrangera element som är ur funktion. Eftersom vi kan bygga en heap med hjälp av en array utan extra minne (för noder, till exempel), kan vi använda heapsort för att sortera arrayen på plats.
Data struktur | |
---|---|
Listor | |
Träd | |
Räknar | |
Övrig |
av operativsystem | Aspekter|||||
---|---|---|---|---|---|
| |||||
Typer |
| ||||
Kärna |
| ||||
Processledning _ |
| ||||
Minneshantering och adressering | |||||
Ladda och initieringsverktyg | |||||
skal | |||||
Övrig | |||||
Kategori Wikimedia Commons Wikibooks Wiktionary |