logo

Max Heap i Python

A Max-Heap är ett komplett binärt träd där värdet i varje intern nod är större ä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 ett index k, så lagras dess vänstra barn i index 2k+1 och dess rätta barn vid index 2k+2 .

Exempel på Max Heap:



max-hög

Hur representeras Max Heap?

En maxhög är ett komplett binärt träd. En maxhög representeras vanligtvis som en array. Rotelementet kommer att vara vid Arr[0]. Tabellen nedan visar index för andra noder för den ith-noden, dvs Arr[i]:

  • Arr[(i-1)/2] Returnerar den överordnade noden.
  • Arr[(2*i)+1] Returnerar den vänstra underordnade noden.
  • Arr[(2*i)+2] Returnerar den högra underordnade noden.

Operationer på Max Heap:

  1. getMax() : Det returnerar rotelementet för Max Heap. Tidskomplexiteten för denna operation är O(1) .
  2. extraheraMax() : Tar bort det maximala elementet från MaxHeap. Tidskomplexiteten för denna operation är O(log n) eftersom denna operation behöver underhålla heap-egenskapen (genom att anropa heapify()) efter att roten tagits bort.
  3. Föra in() : Att sätta in en ny nyckel tar O(log n) tid. Vi lägger till en ny nyckel i slutet av trädet. Om den nya nyckeln är mindre ä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.

Notera: I implementeringen nedan gör vi indexering från index 1 för att förenkla implementeringen.



Pytonorm


skiva java





boolesk till strängjava

# Python3 implementation of Max Heap> import> sys> class> MaxHeap:> >def> __init__(>self>, maxsize):> > >self>.maxsize>=> maxsize> >self>.size>=> 0> >self>.Heap>=> [>0>]>*> (>self>.maxsize>+> 1>)> >self>.Heap[>0>]>=> 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):> > >if> pos>>=> (>self>.size>/>/>2>)>and> pos <>=> self>.size:> >return> True> >return> False> ># 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> maxHeapify(>self>, pos):> ># If the node is a non-leaf node and smaller> ># 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>.maxHeapify(>self>.leftChild(pos))> ># Swap with the right child and heapify> ># the right child> >else>:> >self>.swap(pos,>self>.rightChild(pos))> >self>.maxHeapify(>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 remove and return the maximum> ># element from the heap> >def> extractMax(>self>):> >popped>=> self>.Heap[>self>.FRONT]> >self>.Heap[>self>.FRONT]>=> self>.Heap[>self>.size]> >self>.size>->=> 1> >self>.maxHeapify(>self>.FRONT)> > >return> popped> # Driver Code> if> __name__>=>=> '__main__'>:> > >print>(>'The maxHeap is '>)> > >maxHeap>=> MaxHeap(>15>)> >maxHeap.insert(>5>)> >maxHeap.insert(>3>)> >maxHeap.insert(>17>)> >maxHeap.insert(>10>)> >maxHeap.insert(>84>)> >maxHeap.insert(>19>)> >maxHeap.insert(>6>)> >maxHeap.insert(>22>)> >maxHeap.insert(>9>)> >maxHeap.>Print>()> > >print>(>'The Max val is '> +> str>(maxHeap.extractMax()))>

>

>

Produktion

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

Använda biblioteksfunktioner:

Vi använder heapq klass för att implementera Heap i Python. Som standard implementeras Min Heap av denna klass. Men vi multiplicerar varje värde med -1 så att vi kan använda det som MaxHeap.

Python3


1 miljard till miljon



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

binärt träd vs binärt sökträd

>

>

Produktion

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

Använda biblioteksfunktioner med dunder-metoden för siffror, strängar, tupler, objekt etc

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

För att implementera MaxHeap inte begränsande till endast siffror utan alla typer av objekt (String, Tuple, Object etc) bör vi

  1. Skapa en Wrapper-klass för objektet i listan.
  2. Åsidosätt __lt__ dunder metod för att ge omvänt resultat.

Följande är implementeringen av metoden som nämns här.

'abc' är i siffror'

Python3




'''> Python3 program to implement MaxHeap Operation> with built-in module heapq> for String, Numbers, Objects> '''> from> functools>import> total_ordering> import> heapq>|_+_|