UN Tas maximum est un arbre binaire complet dans lequel la valeur de chaque nœud interne est supérieure ou égale aux valeurs des enfants de ce nœud. Mapper les éléments d'un tas dans un tableau est trivial : si un nœud est stocké à l'index k, alors son enfant gauche est stocké à l'index 2k+1 et son enfant droit à l'index 2k+2 .
Exemples de tas maximum :
Comment Max Heap est-il représenté ?
Un tas maximum est un arbre binaire complet. Un tas maximum est généralement représenté sous forme de tableau. L'élément racine sera à Arr[0]. Le tableau ci-dessous montre les index des autres nœuds pour le ième nœud, c'est-à-dire Arr[i] :
- Arr[(i-1)/2] Renvoie le nœud parent.
- Arr[(2*i)+1] Renvoie le nœud enfant gauche.
- Arr[(2*i)+2] Renvoie le nœud enfant droit.
Opérations sur Max Heap :
- obtenirMax() : Il renvoie l'élément racine de Max Heap. La complexité temporelle de cette opération est O(1) .
- extraireMax() : Supprime le maximum d'éléments de MaxHeap. La complexité temporelle de cette opération est O (log n) car cette opération doit conserver la propriété tas (en appelant heapify()) après avoir supprimé la racine.
- insérer() : L'insertion d'une nouvelle clé prend O (log n) temps. Nous ajoutons une nouvelle clé à la fin de l'arborescence. Si la nouvelle clé est plus petite que son parent, nous n’avons rien à faire. Sinon, nous devons remonter pour corriger la propriété du tas violée.
Note: Dans l'implémentation ci-dessous, nous effectuons une indexation à partir de l'index 1 pour simplifier l'implémentation.
Python
différence entre le renard et le loup
# 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()))> |
interface vs classe abstraite
>
>Sortir
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>
Utilisation des fonctions de la bibliothèque :
Nous utilisons tas classe pour implémenter Heap en Python. Par défaut, Min Heap est implémenté par cette classe. Mais nous multiplions chaque valeur par -1 afin de pouvoir l'utiliser comme MaxHeap.
Python3
fonctionnalités de Java
# 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>=> ' '>)> |
>
liste des religions
>Sortir
Head value of heap : 400 The heap elements : 400 30 20 10 The heap elements : 30 10 20>
Utilisation des fonctions de bibliothèque avec la méthode dunder pour les nombres, les chaînes, les tuples, les objets, etc.
Nous utilisons tas classe pour implémenter Heaps en Python. Par défaut, Min Heap est implémenté par cette classe.
Pour implémenter MaxHeap sans se limiter aux nombres mais à tout type d'objet (String, Tuple, Object, etc.), nous devrions
- Créez une classe Wrapper pour l'élément de la liste.
- Remplacer le __lt__ méthode dunder pour donner le résultat inverse.
Voici la mise en œuvre de la méthode mentionnée ici.
liste de tableaux triée en Java
Python3
'''> Python3 program to implement MaxHeap Operation> with built-in module heapq> for String, Numbers, Objects> '''> from> functools>import> total_ordering> import> heapq>|_+_| |