Heap (datastruktur)

Illustration av en binär max-heap.

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

Illustration av en heap implementerad i en array.

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

I en binär max-heap läggs ett nytt element till på följande sätt:

  1. Lägg till det nya elementet till den nedersta nivån i den första lediga platsen till vänster.
  2. Jämför det nytillagda elementet med sin föraldranod. Är föräldranodens värde större, sluta.
  3. Om inte, byt plats på noderna och upprepa steg 2.
Steg 1Steg 2/3Steg 3/3
Heap
Array
BeskrivningEtt nytt element X läggs till. I det här fallet är X lika med 15.15 är större än 8, så noderna byter plats.15 är större än 11, så noderna byter plats. 15 är nu ny rot, och har därmed ingen föräldranod, så insättningen är klar.

Borttagande av roten

Borttagande av roten på en binär max-heap går till på följande sätt:

  1. Ta bort roten. Ta noden B som är längst ner, längst till höger och sätt i rotens ställe.
  2. Om B är större än sina barn, sluta.
  3. Annars, byt plats på B och det största av dess barn. Gå tillbaka till steg 2.
Steg 1Steg 2/3
Heap
Array
BeskrivningRoten tas bort och elementet 4 tar dess plats.Båda barnen (5 och 8) är större än 4. 8 är större än 5, så 8 och 4 byter plats. 4 har nu inga barn, så borttagandet är klart.

Se även

Media som används på denna webbplats

Question book-4.svg
Författare/Upphovsman: Tkgd2007, Licens: CC BY-SA 3.0
A new incarnation of Image:Question_book-3.svg, which was uploaded by user AzaToth. This file is available on the English version of Wikipedia under the filename en:Image:Question book-new.svg
Max-heap.png
Illustration of a Complete Binary Max Heap.
Binary tree in array.svg

Diagram demonstrating how an implicit representation of a complete binary tree can be stored in an array, as used in the heap data structure of heap sort. Created by Derrick Coetzee in Adobe Illustrator from the original source for en:Image:Binary_tree_in_array.png, which this replaces. chut

mc randi hmc
Heap add step1.svg
Adding an element to a binary heap: step 1.
Heap add step2.svg
Adding an element to a binary heap: step 2.
Heap add step3.svg
Adding an element to a binary heap: step 3.
Heap remove step1.svg
Removing an element from a binary heap: step 1.
Heap remove step2.svg
Removing an element from a binary heap: step 2.