logo

Maksymalna sterta w Pythonie

A Maksymalny stos to kompletne drzewo binarne, w którym wartość w każdym węźle wewnętrznym jest większa lub równa wartościom w elementach potomnych tego węzła. Mapowanie elementów sterty na tablicę jest proste: jeśli węzeł jest przechowywany z indeksem k, wówczas jego lewe dziecko jest przechowywane pod indeksem 2k+1 i jego prawe dziecko w indeksie 2k+2 .

Przykłady maksymalnej sterty:



maksymalna sterta

Jak jest reprezentowany Max Heap?

Maksymalna sterta to kompletne drzewo binarne. Maksymalna sterta jest zwykle reprezentowana jako tablica. Element główny będzie znajdował się w Arr[0]. Poniższa tabela przedstawia indeksy pozostałych węzłów dla i-tego węzła, czyli Arr[i]:

  • Arr[(i-1)/2] Zwraca węzeł nadrzędny.
  • Arr[(2*i)+1] Zwraca lewy węzeł podrzędny.
  • Arr[(2*i)+2] Zwraca prawy węzeł podrzędny.

Operacje na stercie Max:

  1. pobierzMax() : Zwraca element główny Max Heap. Złożoność czasowa tej operacji wynosi O(1) .
  2. wyodrębnijMax() : Usuwa maksymalny element z MaxHeap. Złożoność czasowa tej operacji wynosi O(log n) ponieważ ta operacja wymaga zachowania właściwości sterty (poprzez wywołanie funkcji heapify()) po usunięciu katalogu głównego.
  3. wstawić() : Włożenie nowego klucza trwa O(log n) czas. Dodajemy nowy klucz na końcu drzewa. Jeśli nowy klucz jest mniejszy niż jego rodzic, nie musimy nic robić. W przeciwnym razie musimy przejść w górę, aby naprawić naruszoną właściwość sterty.

Notatka: W poniższej implementacji wykonujemy indeksowanie od indeksu 1, aby uprościć implementację.



Pyton


wywoływanie funkcji js z HTML





# 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()))>

komentarz XML

>

>

Wyjście

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>

Korzystanie z funkcji biblioteki:

Używamy sterta class do implementacji Heap w Pythonie. Domyślnie ta klasa implementuje Min Heap. Ale mnożymy każdą wartość przez -1, abyśmy mogli użyć jej jako MaxHeap.

Python3




Java łączy się z mysql

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

>

alfabet na cyfrę
>

Wyjście

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

Używanie funkcji bibliotecznych z metodą dunder dla liczb, ciągów znaków, krotek, obiektów itp

Używamy sterta class do implementacji stert w Pythonie. Domyślnie ta klasa implementuje Min Heap.

Aby zaimplementować MaxHeap nie ograniczając się tylko do liczb, ale dowolnego typu obiektu (ciąg, krotka, obiekt itp.), powinniśmy

  1. Utwórz klasę opakowania dla elementu na liście.
  2. Zastąp __lt__ metoda Dundera, aby uzyskać odwrotny wynik.

Poniżej znajduje się implementacja wspomnianej tutaj metody.

Java sortowanie listy tablic

Python3




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