A Min-Heap ir pilnīgs binārs koks, kurā vērtība katrā iekšējā mezglā ir mazāka vai vienāda ar vērtībām šī mezgla atvasinātajos.
Kaudzes elementu kartēšana masīvā ir triviāla: ja mezgls tiek saglabāts indeksā k , tad tā atstāts bērns tiek saglabāts indeksā 2k+1 un tas ir pareizais bērns pie indeksa 2k+2 priekš 0 balstīta indeksācija un priekš 1 balstīta indeksācija kreisais bērns būs plkst 2k un īstais bērns būs plkst 2k+1 .
Minimālās kaudzes piemērs:
5 13 / / 10 15 16 31 / / / 30 41 51 100 41>
Kā tiek attēlots Min Heap?
Minimālā kaudze ir pilnīgs binārs koks. Minimālā kaudze parasti tiek attēlota kā masīvs. Saknes elements būs plkst Arr[0] . Jebkuram i-tam mezglam, t.i., Arr[i] :
- Arr[(i -1) / 2] atgriež savu vecāku mezglu. Arr[(2 * i) + 1] atgriež kreiso atvasināto mezglu. Arr[(2 * i) + 2] atgriež savu labo atvasināto mezglu.
Darbības ar Min Heap:
- getMin() : tas atgriež Min Heap saknes elementu. Laiks Šīs operācijas sarežģītība ir O(1) . extractMin() : no MinHeap noņem minimālo elementu. Šīs operācijas laika sarežģītība ir O(Žurnāls n) jo šai darbībai ir jāsaglabā kaudzes rekvizīts (izsaucot heapify()) pēc saknes noņemšanas. insert() : jaunas atslēgas ievietošana notiek O(Žurnāls n) laiks. Mēs pievienojam jaunu atslēgu koka galā. Ja jaunā atslēga ir lielāka par tās vecāku, mums nekas nav jādara. Pretējā gadījumā mums ir jāpārvietojas augšup, lai labotu bojāto kaudzes īpašumu.
Zemāk ir Min Heap ieviešana Python -
uzņēmēja Linux
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> >>> > > # 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> .leftChild(pos)]> or> > self> .Heap[pos]>>> 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>>> .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()))> |
string.valueof
>
>
Izvade:
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>
Izmantojot bibliotēkas funkcijas:
Mēs izmantojam kaudze q klasē, lai ieviestu Heaps Python. Pēc noklusējuma šī klase ir ieviesusi Min Heap.
mylivecriclet
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> => ' '> )> |
pretrunīga meklēšana
>
>
Izvade:
Head value of heap : 10 The heap elements : 10 30 20 400 The heap elements : 20 30 400>