Heap (datastruktur)
Den här artikeln behöver källhänvisningar för att kunna verifieras. (2023-07) Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kan ifrågasättas och tas bort utan att det behöver diskuteras på diskussionssidan. |
Ett partiellt ordnat vänsterbalanserat träd (engelska: heap) är en datastruktur, närmare bestämt ett träd, som karakteriseras av att
- varje nods värde är större eller lika med värdena i nodens barn (partiellt ordnat).
- trädets grenar är så lika långa som möjligt. I fall det inte är möjligt så fylls den nedersta nivån på från vänster (vänsterbalanserat).
Detta kallas ibland för en max-heap, alternativt kan man implementera en heap så att varje nods värde är mindre eller lika med nodens barns värden, en sådan heap kallas min-heap.
Namnet heap kommer från att det faktum att trädet är vänsterbalanserat gör det implementerbart i ett sammanhängande minnesområde, till exempel en minnesheap eller array. Nivå k i ett träd där varje nod har b barn, räknat med roten som 0, har noder. Första noden på nivån har position indexerat från 0. Alltså går det att räkna ut var i minnet en viss nod finns lagrad, om trädet har minst så många noder.
Detta i kombination med partiell ordning gör operationen att upprepade gånger "plocka" det största talet ur trädet billig, samtidigt som nya element och uppdateringar är effektiva. Den är därför lämplig som exempelvis prioritetskö för jobb.
Binär heap
[redigera | redigera wikitext]I en binär heap har varje nod två barn, det vill säga att heapen är ett binärt träd. Detta implementeras oftast i en array, där roten har plats noll och nod k har sina barn på plats 2k + 1 respektive 2k + 2. En nods k förälder kan nås genom att avrunda (k - 1)/2 neråt till närmaste heltal. Att läsa elementen i en array är som att läsa det binära trädet vänster till höger, uppifrån och ner.
Insättande av element
[redigera | redigera wikitext]I en binär max-heap läggs ett nytt element till på följande sätt:
- Lägg till det nya elementet till den nedersta nivån i den första lediga platsen till vänster.
- Jämför det nytillagda elementet med sin föraldranod. Är föräldranodens värde större, sluta.
- Om inte, byt plats på noderna och upprepa steg 2.
Borttagande av roten
[redigera | redigera wikitext]Borttagande av roten på en binär max-heap går till på följande sätt:
- Ta bort roten. Ta noden B som är längst ner, längst till höger och sätt i rotens ställe.
- Om B är större än sina barn, sluta.
- Annars, byt plats på B och det största av dess barn. Gå tillbaka till steg 2.