Min Heap în Python

A Min-Heap este un arbore binar complet în care valoarea din fiecare nod intern este mai mică sau egală cu valorile din copiii acelui nod.
Maparea elementelor unui heap într-o matrice este trivială: dacă un nod este stocat la index k , apoi e copil lăsat este stocat la index 2k+1 si este copilul drept la index 2k+2 pentru indexare bazată pe 0 si pentru 1 indexare bazată copilul stâng va fi la 2k iar copilul potrivit va fi la 2k+1 .

Exemplu de min Heap:

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

Cum este reprezentat Min Heap?
Un min Heap este un arbore binar complet. Un heap Min este de obicei reprezentat ca o matrice. Elementul rădăcină va fi la Arr[0] . Pentru orice i-lea nod, adică Arr[i] :

    Arr[(i -1) / 2] returnează nodul părinte. Arr[(2 * i) + 1] returnează nodul său copil stâng. Arr[(2 * i) + 2] returnează nodul său secundar drept.

Operațiuni pe min Heap:

    getMin() : returnează elementul rădăcină al Heapului min. Timpul Complexitatea acestei operațiuni este O(1) . extractMin() : elimină elementul minim din MinHeap. Timpul Complexitatea acestei operațiuni este O(Log n) deoarece această operație trebuie să mențină proprietatea heap (prin apelarea heapify()) după eliminarea rădăcină. insert() : Inserarea unei noi chei ia O(Log n) timp. Adăugăm o cheie nouă la capătul arborelui. Dacă cheia nouă este mai mare decât cea părinte, atunci nu trebuie să facem nimic. În caz contrar, trebuie să traversăm în sus pentru a remedia proprietatea heap încălcată.

Mai jos este implementarea Min Heap în Python -

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> >>>> .Heap[> self> .leftChild(pos)]> or> > self> .Heap[pos]>>>> 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()))>

Ieșire:

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 

Utilizarea funcțiilor Bibliotecii:
Folosim heapq clasă pentru a implementa Heaps în Python. În mod implicit, Min Heap este implementat de această clasă.

Python3




# 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> => ' '> )>

Ieșire:

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