logo

Min Heap i Python

A Min-Hög är ett komplett binärt träd där värdet i varje intern nod är mindre än eller lika med värdena i den nodens barn.
Att kartlägga elementen i en hög till en array är trivialt: om en nod lagras i index k , då är det vänster barn lagras i index 2k+1 och dess rätt barn vid index 2k+2 för 0-baserad indexering och för 1 baserad indexering det vänstra barnet kommer att vara kl 2k och rätt barn kommer att vara på 2k+1 .

Exempel på Min Heap:



 5 13 /  /  10 15 16 31 / /  /  30 41 51 100 41>

Hur representeras Min Heap?
En Min Heap är ett komplett binärt träd. En Min-hög representeras vanligtvis som en array. Rotelementet kommer att vara kl Arr[0] . För alla it-noder, dvs. Arr[i] :

    Arr[(i -1) / 2] returnerar sin överordnade nod. Arr[(2 * i) + 1] returnerar sin vänstra underordnade nod. Arr[(2 * i) + 2] returnerar sin högra underordnade nod.

Operationer på Min Heap:

    getMin() : Den returnerar rotelementet i Min Heap. Tidskomplexiteten för denna operation är O(1) . extractMin() : Tar bort minimielementet från MinHeap. Tidskomplexiteten för denna operation är O(Logg n) eftersom den här operationen behöver underhålla heap-egenskapen (genom att anropa heapify()) efter att ha tagit bort root. insert() : Att infoga en ny nyckel tar O(Logg n) tid. Vi lägger till en ny nyckel i slutet av trädet. Om den nya nyckeln är större än sin förälder behöver vi inte göra någonting. Annars måste vi korsa upp för att fixa den kränkta högegendomen.

Nedan är implementeringen av Min Heap i Python –



förbeställ korsning av ett träd

Python3






# Python3 implementation of Min Heap> > import> sys> > class> MinHeap:> > >def> __init__(>self>, maxsize):> >self>.maxsize>=> maxsize> >self>.size>=> 0> >self>.Heap>=> [>0>]>*>(>self>.maxsize>+> 1>)> >self>.Heap[>0>]>=> ->1> *> sys.maxsize> >self>.FRONT>=> 1> > ># Function to return the position of> ># parent for the node currently> ># at pos> >def> parent(>self>, pos):> >return> pos>/>/>2> > ># Function to return the position of> ># the left child for the node currently> ># at pos> >def> leftChild(>self>, pos):> >return> 2> *> pos> > ># Function to return the position of> ># the right child for the node currently> ># at pos> >def> rightChild(>self>, pos):> >return> (>2> *> pos)>+> 1> > ># Function that returns true if the passed> ># node is a leaf node> >def> isLeaf(>self>, pos):> >return> pos>*>2> >>self>.size> > ># Function to swap two nodes of the heap> >def> swap(>self>, fpos, spos):> >self>.Heap[fpos],>self>.Heap[spos]>=> self>.Heap[spos],>self>.Heap[fpos]> > ># Function to heapify the node at pos> >def> minHeapify(>self>, pos):> > ># If the node is a non-leaf node and greater> ># than any of its child> >if> not> self>.isLeaf(pos):> >if> (>self>.Heap[pos]>>self>.Heap[>self>.leftChild(pos)]>or> >self>.Heap[pos]>>self>.Heap[>self>.rightChild(pos)]):> > ># Swap with the left child and heapify> ># the left child> >if> self>.Heap[>self>.leftChild(pos)] <>self>.Heap[>self>.rightChild(pos)]:> >self>.swap(pos,>self>.leftChild(pos))> >self>.minHeapify(>self>.leftChild(pos))> > ># Swap with the right child and heapify> ># the right child> >else>:> >self>.swap(pos,>self>.rightChild(pos))> >self>.minHeapify(>self>.rightChild(pos))> > ># Function to insert a node into the heap> >def> insert(>self>, element):> >if> self>.size>>=> self>.maxsize :> >return> >self>.size>+>=> 1> >self>.Heap[>self>.size]>=> element> > >current>=> self>.size> > >while> self>.Heap[current] <>self>.Heap[>self>.parent(current)]:> >self>.swap(current,>self>.parent(current))> >current>=> self>.parent(current)> > ># Function to print the contents of the heap> >def> Print>(>self>):> >for> i>in> range>(>1>, (>self>.size>/>/>2>)>+>1>):> >print>(>' PARENT : '>+> str>(>self>.Heap[i])>+>' LEFT CHILD : '>+> >str>(>self>.Heap[>2> *> i])>+>' RIGHT CHILD : '>+> >str>(>self>.Heap[>2> *> i>+> 1>]))> > ># Function to build the min heap using> ># the minHeapify function> >def> minHeap(>self>):> > >for> pos>in> range>(>self>.size>/>/>2>,>0>,>->1>):> >self>.minHeapify(pos)> > ># Function to remove and return the minimum> ># element from the heap> >def> remove(>self>):> > >popped>=> self>.Heap[>self>.FRONT]> >self>.Heap[>self>.FRONT]>=> self>.Heap[>self>.size]> >self>.size>->=> 1> >self>.minHeapify(>self>.FRONT)> >return> popped> > # Driver Code> if> __name__>=>=> '__main__'>:> > >print>(>'The minHeap is '>)> >minHeap>=> MinHeap(>15>)> >minHeap.insert(>5>)> >minHeap.insert(>3>)> >minHeap.insert(>17>)> >minHeap.insert(>10>)> >minHeap.insert(>84>)> >minHeap.insert(>19>)> >minHeap.insert(>6>)> >minHeap.insert(>22>)> >minHeap.insert(>9>)> >minHeap.minHeap()> > >minHeap.>Print>()> >print>(>'The Min val is '> +> str>(minHeap.remove()))>

>

java array

>

Utgång:

The Min Heap is PARENT : 3 LEFT CHILD : 5 RIGHT CHILD :6 PARENT : 5 LEFT CHILD : 9 RIGHT CHILD :84 PARENT : 6 LEFT CHILD : 19 RIGHT CHILD :17 PARENT : 9 LEFT CHILD : 22 RIGHT CHILD :10 The Min val is 3>

Använda biblioteksfunktioner:
Vi använder heapq klass för att implementera Heaps i Python. Som standard implementeras Min Heap av denna klass.

Python3


strängens värde



# Python3 program to demonstrate working of heapq> > from> heapq>import> heapify, heappush, heappop> > # Creating empty heap> heap>=> []> heapify(heap)> > # Adding items to the heap using heappush function> heappush(heap,>10>)> heappush(heap,>30>)> heappush(heap,>20>)> heappush(heap,>400>)> > # printing the value of minimum element> print>(>'Head value of heap : '>+>str>(heap[>0>]))> > # printing the elements of the heap> print>(>'The heap elements : '>)> for> i>in> heap:> >print>(i, end>=> ' '>)> print>(>' '>)> > element>=> heappop(heap)> > # printing the elements of the heap> print>(>'The heap elements : '>)> for> i>in> heap:> >print>(i, end>=> ' '>)>

>

separat sträng i java

>

Utgång:

Head value of heap : 10 The heap elements : 10 30 20 400 The heap elements : 20 30 400>