Fronta haldy (nebo heapq) v Pythonu
Python .
Vytvoření jednoduché haldy
The heapify (opakovatelné) :- Tato funkce se používá převést iterovatelné na hromadu datová struktura. tj. v pořadí hromady.
Python3
# importing 'heapq' to implement heap queue> import> heapq> # initializing list> li> => [> 5> ,> 7> ,> 9> ,> 1> ,> 3> ]> # using heapify to convert list into heap> heapq.heapify(li)> # printing created heap> print> (> 'The created heap is : '> ,(> list> (li)))> |
Výstup
The created heap is : [1, 3, 9, 7, 5]
Efektivní přidávání a otevírání položek
- heappush(heap, ele) : Tato funkce se používá k vložení prvku uvedeného v jeho argumentech do haldy. The pořadí je upraveno tak, aby byla zachována struktura haldy. heappop(heap) : Tato funkce se používá k odstranění a vrácení nejmenšího prvku z haldy. Pořadí je upraveno tak, aby byla zachována struktura haldy.
Python3
# importing 'heapq' to implement heap queue> import> heapq> # initializing list> li> => [> 5> ,> 7> ,> 9> ,> 1> ,> 3> ]> # using heapify to convert list into heap> heapq.heapify(li)> # printing created heap> print> (> 'The created heap is : '> , end> => '')> print> (> list> (li))> # using heappush() to push elements into heap> # pushes 4> heapq.heappush(li,> 4> )> # printing modified heap> print> (> 'The modified heap after push is : '> , end> => '')> print> (> list> (li))> # using heappop() to pop smallest element> print> (> 'The popped and smallest element is : '> , end> => '')> print> (heapq.heappop(li))> |
Výstup
The created heap is : [1, 3, 9, 7, 5] The modified heap after push is : [1, 3, 4, 7, 5, 9] The popped and smallest element is : 1
Připojování a vyskakování zároveň
- heappushpop(heap, ele) :- Tato funkce kombinuje fungování jak push, tak pop operací v jednom příkazu, čímž zvyšuje efektivitu. Po této operaci je zachováno pořadí haldy. heapreplace(heap, ele) :- Tato funkce také vkládá a vyskakuje prvky do jednoho příkazu, ale liší se od výše uvedené funkce. V tomto případě je prvek nejprve vysunut, poté je prvek zatlačen. tj. lze vrátit hodnotu větší než vložená hodnota. heapreplace() na rozdíl od heappushpop() vrací nejmenší hodnotu původně v haldě bez ohledu na vložený prvek.
Python3
# importing 'heapq' to implement heap queue> import> heapq> # initializing list 1> li1> => [> 5> ,> 1> ,> 9> ,> 4> ,> 3> ]> # initializing list 2> li2> => [> 5> ,> 7> ,> 9> ,> 4> ,> 3> ]> # using heapify() to convert list into heap> heapq.heapify(li1)> heapq.heapify(li2)> # using heappushpop() to push and pop items simultaneously> # pops 2> print> (> 'The popped item using heappushpop() is : '> , end> => '')> print> (heapq.heappushpop(li1,> 2> ))> # using heapreplace() to push and pop items simultaneously> # pops 3> print> (> 'The popped item using heapreplace() is : '> , end> => '')> print> (heapq.heapreplace(li2,> 2> ))> |
Výstup
The popped item using heappushpop() is : 1 The popped item using heapreplace() is : 3
Najděte největší a nejmenší prvky z Heap v Pythonu
- nlargest(k, iterable, key = fun) : Tato funkce se používá k vrácení k největších prvků ze zadané iterovatelné a ke splnění klíče, pokud je zmíněn. nsmallest(k, iterable, key = fun) : Tato funkce se používá k vrácení k nejmenších prvků ze zadané iterovatelné a ke splnění klíče, pokud je zmíněn.
Python3
# Python code to demonstrate working of> # nlargest() and nsmallest()> # importing 'heapq' to implement heap queue> import> heapq> # initializing list> li1> => [> 6> ,> 7> ,> 9> ,> 4> ,> 3> ,> 5> ,> 8> ,> 10> ,> 1> ]> # using heapify() to convert list into heap> heapq.heapify(li1)> # using nlargest to print 3 largest numbers> # prints 10, 9 and 8> print> (> 'The 3 largest numbers in list are : '> , end> => '')> print> (heapq.nlargest(> 3> , li1))> # using nsmallest to print 3 smallest numbers> # prints 1, 3 and 4> print> (> 'The 3 smallest numbers in list are : '> , end> => '')> print> (heapq.nsmallest(> 3> , li1))> |
Výstup
The 3 largest numbers in list are : [10, 9, 8] The 3 smallest numbers in list are : [1, 3, 4]
Příklad:
Python3
import> heapq> # Initialize a list with some values> values> => [> 5> ,> 1> ,> 3> ,> 7> ,> 4> ,> 2> ]> # Convert the list into a heap> heapq.heapify(values)> # Print the heap> print> (> 'Heap:'> , values)> # Add a new value to the heap> heapq.heappush(values,> 6> )> # Print the updated heap> print> (> 'Heap after push:'> , values)> # Remove and return the smallest element from the heap> smallest> => heapq.heappop(values)> # Print the smallest element and the updated heap> print> (> 'Smallest element:'> , smallest)> print> (> 'Heap after pop:'> , values)> # Get the n smallest elements from the heap> n_smallest> => heapq.nsmallest(> 3> , values)> # Print the n smallest elements> print> (> 'Smallest 3 elements:'> , n_smallest)> # Get the n largest elements from the heap> n_largest> => heapq.nlargest(> 2> , values)> # Print the n largest elements> print> (> 'Largest 2 elements:'> , n_largest)> |
Výstup
Heap: [1, 4, 2, 7, 5, 3] Heap after push: [1, 4, 2, 7, 5, 3, 6] Smallest element: 1 Heap after pop: [2, 4, 3, 7, 5, 6] Smallest 3 elements: [2, 3, 4] Largest 2 elements: [7, 6]
Tento program vytváří frontu haldy pomocí modulu heapq v Pythonu a provádí různé operace, jako je převod seznamu na haldu, přidání nové hodnoty do haldy, odstranění nejmenšího prvku z haldy, získání n nejmenších a n největších elementů z haldy. hromada.
Poznámka že modul heapq v Pythonu poskytuje funkce pro provádění operací s haldou na seznamech na místě, aniž by bylo nutné pro haldu vytvářet samostatnou datovou strukturu. Modul heapq je efektivní a snadno použitelný, díky čemuž je oblíbenou volbou pro implementaci prioritních front a dalších datových struktur v Pythonu.
Výhody použití fronty haldy (nebo heapq) v Pythonu:
- Efektivní: Fronta haldy je vysoce efektivní datová struktura pro správu prioritních front a hald v Pythonu. Poskytuje logaritmickou časovou složitost pro mnoho operací, takže je oblíbenou volbou pro mnoho aplikací. Prostorově efektivní: Fronty haldy jsou prostorově nenáročné, protože ukládají prvky v reprezentaci založené na poli, čímž se minimalizuje režie spojená s datovými strukturami založenými na uzlech, jako jsou propojené seznamy. Snadné použití: Fronty haldy v Pythonu se snadno používají s jednoduchým a intuitivním rozhraním API, které usnadňuje provádění základních operací, jako je vkládání, mazání a načítání prvků z haldy. Flexibilní: Haldové fronty v Pythonu lze použít k implementaci různých datových struktur, jako jsou prioritní fronty, haldy a binární stromy, což z nich dělá všestranný nástroj pro mnoho aplikací.
Nevýhody použití fronty haldy (nebo heapq) v Pythonu:
- Omezená funkčnost: Fronty haldy jsou primárně určeny pro správu prioritních front a hald a nemusí být vhodné pro složitější datové struktury a algoritmy. Žádný náhodný přístup: Fronty haldy nepodporují náhodný přístup k prvkům, což ztěžuje přístup k prvkům uprostřed haldy nebo úpravě prvků, které nejsou v horní části haldy. Žádné řazení: Fronty haldy nepodporují řazení, takže pokud potřebujete seřadit prvky v určitém pořadí, budete muset použít jinou datovou strukturu nebo algoritmus. Není bezpečné pro vlákna: Fronty haldy nejsou bezpečné pro vlákna, což znamená, že nemusí být vhodné pro použití ve vícevláknových aplikacích, kde je kritická synchronizace dat.
Celkově jsou haldové fronty vysoce efektivní a flexibilní datová struktura pro správu prioritních front a hald v Pythonu, ale mohou mít omezenou funkčnost a nemusí být vhodné pro všechny aplikace.