Prioritní fronta, halda

Podobné dokumenty
Spojový seznam. Jan Kybic.

Dynamické datové struktury IV.

Dynamické datové struktury III.

Stromy, haldy, prioritní fronty

Stromy. Jan Hnilica Počítačové modelování 14

Třídění a vyhledávání Searching and sorting

Základní datové struktury III: Stromy, haldy

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Stromy. Jan Kybic.

TGH07 - Chytré stromové datové struktury

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

TGH07 - Chytré stromové datové struktury

Rekurze a rychlé třídění

NPRG030 Programování I, 2018/19 1 / :03:07

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Algoritmy a datové struktury

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Algoritmy na ohodnoceném grafu

IB111 Úvod do programování skrze Python

Algoritmizace prostorových úloh

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

TGH05 - Problém za milion dolarů.

Dynamické datové struktury I.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Časová složitost / Time complexity

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Datové struktury Úvod

Maturitní téma: Programovací jazyk JAVA

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Algoritmizace řazení Bubble Sort

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Rekurzivní algoritmy

TGH08 - Optimální kostry

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

vyhledávací stromové struktury

Grafové algoritmy. Programovací techniky

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Grafové algoritmy. Programovací techniky

Binární vyhledávací stromy pokročilé partie

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

Základní datové struktury

Prioritní fronta, halda (heap), řazení

Záznam, zásobník a fronta

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Lineární spojový seznam (úvod do dynamických datových struktur)

Šablony, kontejnery a iterátory

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

ALGORITMY A DATOVÉ STRUKTURY

a) b) c) Radek Mařík

prioritu a vždy je třeba začít pracovat na úkolu, který ma v daný okamžik

Rozptylovací tabulky

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Použití dalších heuristik

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

TGH06 - Hledání nejkratší cesty

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

TGH06 - Hledání nejkratší cesty

IB111 Úvod do programování skrze Python

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

13. Třídící algoritmy a násobení matic

Datové struktury 2: Rozptylovací tabulky

10. Složitost a výkon

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

Binární halda (= binary heap)

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Prohledávání do šířky = algoritmus vlny

Algoritmizace prostorových úloh

Co když chceme najít i druhý nejmenší prvek? Nebo co když chceme najít k

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Úvod do teorie grafů

Obsah přednášky. Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41

Dynamické datové struktury II.

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Vysvětlete funkci a popište parametry jednotlivých komponent počítače a periferních zařízení.

Obsah. KAPITOLA 1 Dříve než začneme 19 Kdysi dávno aneb střípky z historie algoritmických strojů třicátá léta 22

Základy algoritmizace a programování

Prohledávání stavového prostoru

5 Rekurze a zásobník. Rekurzivní volání metody

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Binární vyhledávací stromy II

Datové typy a struktury

Binární Vyhledávací Stromy, u kterých je. složitost operací v nejhorším. rovná O(log n)

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Prioritní fronta a příklad použití v úloze hledání nejkratších cest

Transkript:

Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26

Prioritní fronta Halda Heap sort 2 / 26

Prioritní fronta (priority queue) Podporuje následující operace pro porovnatelné položky přidání položky (insert) odebrání nejmenší položky (pop) Může podporovat i další operace nedestruktivní čtení ze začátku (peek) zjištění počtu položek ve frontě (size) změna položky 3 / 26

Prioritní fronta (priority queue) Podporuje následující operace pro porovnatelné položky přidání položky (insert) odebrání nejmenší položky (pop) Může podporovat i další operace nedestruktivní čtení ze začátku (peek) zjištění počtu položek ve frontě (size) změna položky Varianty (ekvivalentní) odebíráme největší místo nejmenší ukládáme klíč (prioritu) a hodnotu, třídíme podle klíče, vracíme hodnotu 3 / 26

Prioritní fronta (priority queue) Podporuje následující operace pro porovnatelné položky přidání položky (insert) odebrání nejmenší položky (pop) Může podporovat i další operace nedestruktivní čtení ze začátku (peek) zjištění počtu položek ve frontě (size) změna položky Varianty (ekvivalentní) odebíráme největší místo nejmenší ukládáme klíč (prioritu) a hodnotu, třídíme podle klíče, vracíme hodnotu Zásobník i fronta jsou speciálním případem prioritní fronty. 3 / 26

Aplikace prioritní fronty Hledání k nejmenších prvků Prioritní rozvrhování a plánování (fronta s předbíháním) Simulace diskrétních událostí (priorita=čas) Základní prvek mnoha algoritmů Heapsort (třídící algoritmus) Huffmanovo kódování Informované prohledávání grafu Dijkstrův algoritmus pro hledání nejkratší cesty v grafu Primův algoritmus pro hledání minimální kostry v grafu. 4 / 26

Implementace prioritní fronty implementace vkládání nalezení minima odebrání pole O(1) O(n) O(n) binární strom O(log n) O(log n) O(log n) binární halda O(1) / O(log n) O(1) O(log n) O(1) v průměru pro n prvků, nejhorší případ je O(log n) 5 / 26

Prioritní fronta Halda Heap sort 6 / 26

Binární halda / hromada (binary heap) Prvky jsou uložené v poli a 1, a 2,..., a n Potomky a i jsou a 2i, a 2i+1 (pokud < n) Vlastnost haldy (heap property): uzel není větší, než jeho potomci, a i a 2i, a i a 2i+1 Halda je binární strom, vrstvy až na poslední jsou plně obsazené Images courtesy of Jakub Černý, Brad Miller and David Ranum. 7 / 26

Binární halda / hromada (binary heap) Prvky jsou uložené v poli a 1, a 2,..., a n Potomky a i jsou a 2i, a 2i+1 (pokud < n) Vlastnost haldy (heap property): uzel není větší, než jeho potomci, a i a 2i, a i a 2i+1 Halda je binární strom, vrstvy až na poslední jsou plně obsazené Images courtesy of Jakub Černý, Brad Miller and David Ranum. 7 / 26

Srovnání haldy a stromu binární vyhledávací strom (BST) BST halda uspořádání úplné jen minimum režie významná minimální vyvažování nutné automatické halda je významně rychlejší, potřebuje méně paměti strom je univerzálnější, podporuje více operací 8 / 26

Vkládání do haldy Nový prvek přidáme na konec a probubláme kam patří. 9 / 26

Vkládání do haldy Nový prvek přidáme na konec a probubláme kam patří. 9 / 26

Vkládání do haldy Nový prvek přidáme na konec a probubláme kam patří. 9 / 26

Vkládání implementace class MinHeap: def init (self): self.heap = [] # indexujeme od nuly def bubble_up(self,i): # probublá i ke kořenu while i>0: j=(i-1)//2 # index rodiče if self.heap[i] >= self.heap[j]: break self.heap[j],self.heap[i]=self.heap[i],self.heap[j] i = j def insert(self,k): self.heap+=[k] self.bubble_up(len(self.heap)-1) Indexování od nuly rodič a i je a (i 1)/2, potomci jsou a 2i+1, a 2i+2. Soubor heap.py 10 / 26

Odebrání nejmenšího prvku Minimum je v kořeni stromu. Halda (pole) se zkrátí o jeden prvek. Tento prvek přesuneme do kořene a probubláme dolů: Rekurzivně měníme uzel s menším synem, dokud je porušená vlastnost haldy. 11 / 26

Odebrání nejmenšího prvku Minimum je v kořeni stromu. Halda (pole) se zkrátí o jeden prvek. Tento prvek přesuneme do kořene a probubláme dolů: Rekurzivně měníme uzel s menším synem, dokud je porušená vlastnost haldy. 11 / 26

Odebrání nejmenšího prvku Minimum je v kořeni stromu. Halda (pole) se zkrátí o jeden prvek. Tento prvek přesuneme do kořene a probubláme dolů: Rekurzivně měníme uzel s menším synem, dokud je porušená vlastnost haldy. 11 / 26

Odebrání nejmenšího prvku Minimum je v kořeni stromu. Halda (pole) se zkrátí o jeden prvek. Tento prvek přesuneme do kořene a probubláme dolů: Rekurzivně měníme uzel s menším synem, dokud je porušená vlastnost haldy. 11 / 26

Odebírání nejmenšího prvku implementace def bubble_down(self,i): n=self.size() while 2*i+1 < n: j=2*i+1 # zjisti index menšího syna if j+1 < n and self.heap[j] > self.heap[j+1]: j+=1 if self.heap[i]>self.heap[j]: self.heap[i],self.heap[j]=self.heap[j],self.heap[i] i=j def pop(self): """ odeber a vrať nejmenší prvek """ element=self.heap[0] self.heap[0]=self.heap[-1] self.heap.pop() # smaž poslední prvek self.bubble_down(0) return element 12 / 26

Vytvoření haldy Jak vytvořit haldu z pole Opakované volání insert složitost O(n log n) Pole prohlásíme za haldu a opakovaně voláme bubble_down složitost O(n) Image courtesy of Swfung8 (Wikipedia). 13 / 26

Vytvoření haldy Jak vytvořit haldu z pole Opakované volání insert složitost O(n log n) Pole prohlásíme za haldu a opakovaně voláme bubble_down složitost O(n) 13 / 26

Vytvoření haldy implementace Cyklus přes prvky, které mají potomky, od posledního k prvnímu: def buildheap(a,type=minheap): """ vytvoří haldu z obsahu pole, pole je přepsáno """ h=type() # vytvoření MinHeap nebo MaxHeap h.heap=a # kopie for i in range((len(a)-1)//2,-1,-1): h.bubble_down(i) return h heap.py obsahuje MinHeap a MaxHeap 14 / 26

Halda příklad import heap h=heap.minheap() for x in [9, 5, 0, 6, 2, 3]: h.insert(x) # vkládáme po jednom print(h.pop()) # nejmenší prvek 0 h.insert(4) while not h.is_empty(): print(h.pop(),end=", ") 2, 3, 4, 5, 6, 9, 15 / 26

Halda příklad (2) h=heap.buildheap([9, 5, 0, 6, 2, 3]) while not h.is_empty(): print(h.pop(),end=", ") 0, 2, 3, 5, 6, 9, h=heap.buildheap([9, 5, 0, 6, 2, 3],type=heap.MaxHeap) while not h.is_empty(): print(h.pop(),end=", ") 9, 6, 5, 3, 2, 0, 16 / 26

Prioritní fronta Halda Heap sort 17 / 26

Heap sort třídění haldou Postup Vytvoříme z pole haldu Opakovaně odebíráme nejmenší prvek setříděná posloupnost. 18 / 26

Heap sort třídění haldou Postup Vytvoříme z pole haldu Opakovaně odebíráme nejmenší prvek setříděná posloupnost. Halda i setříděná posloupnost budou sdílet stejné pole. Použijeme sestupně setříděnou haldu (MaxHeap). 18 / 26

Heap sort třídění haldou Postup Vytvoříme z pole haldu Opakovaně odebíráme nejmenší prvek setříděná posloupnost. Halda i setříděná posloupnost budou sdílet stejné pole. Použijeme sestupně setříděnou haldu (MaxHeap). Vlastnosti Složitost v nejhorším i průměrném případě O(n log n). Nepotřebuje pomocnou paměť. 18 / 26

Heap sort implementace def bubble_down(a,i,n): while 2*i+1 < n: j=2*i+1 # zjisti index menšího syna if j+1 < n and a[j] < a[j+1]: j+=1 if a[i]<a[j]: a[i],a[j]=a[j],a[i] i=j def heap_sort(a): n=len(a) for i in range((n-1)//2,-1,-1): bubble_down(a,i,n) for i in range(n-1,0,-1): # od n-1 do 1 a[0],a[i]=a[i],a[0] bubble_down(a,0,i) return a Soubor heapsort.py. 19 / 26

Heap sort příklad from heapsort import heap_sort a=[70, 93, 18, 37, 64, 79, 4, 28, 48, 65] heap_sort(a) print(a) [4, 18, 28, 37, 48, 64, 65, 70, 79, 93] 20 / 26

Heap sort porovnání rychlosti Empirická složitost 10 1 10 0 merge_sort quick_sort heap_sort python_sort 10-1 time [s] 10-2 10-3 10-4 10 3 10 4 10 5 N 21 / 26

Další haldy k-regulární halda každý uzel k potomků. Fibonacciho halda (Fredman, Tarjan 1984) s rostoucí hloubkou klesá maximální počet potomků. Umí vkládat a aktualizovat v čase O(1). přihrádková halda (bucket/radix heap) pro malou abecedu o velikosti k. Složitost nalezení minima O(k). 22 / 26

Halda v Pythonu Modul heapq. Operace heapify (vytvoření), heappush (přidání) a heappop (odebrání). import heapq h=[] for x in [9, 5, 0, 6, 2, 3]: heapq.heappush(h,x) # vkládáme po jednom print([ heapq.heappop(h) for i in range(len(h))]) [0, 2, 3, 5, 6, 9] 23 / 26

Heapsort a heapq def heap_sort(a): h=a.copy() heapq.heapify(h) for i in range(len(a)): a[i]=heapq.heappop(h) 24 / 26

Heapsort a heapq def heap_sort(a): h=a.copy() heapq.heapify(h) for i in range(len(a)): a[i]=heapq.heappop(h) x=[75, 61, 5, 66, 35, 55, 20, 48, 41, 85] heap_sort(x) print(x) [5, 20, 35, 41, 48, 55, 61, 66, 75, 85] 24 / 26

Heapsort a heapq def heap_sort(a): h=a.copy() heapq.heapify(h) for i in range(len(a)): a[i]=heapq.heappop(h) x=[75, 61, 5, 66, 35, 55, 20, 48, 41, 85] heap_sort(x) print(x) [5, 20, 35, 41, 48, 55, 61, 66, 75, 85] Potřebuje pomocné pole Soubor heapsort2.py 24 / 26

Halda shrnutí Datová struktura pro rychlé hledání minimálního prvku umožňující přidávání. Používáme pro implementace prioritní fronty. Vlastnost haldy prvky od kořene k listu neklesají / nerostou. Velmi efektivní implementace pomocí pole. Nepotřebuje odkazy. Haldu lze sestrojit v čase O(n), odebrání nejmenšího prvku trvá O(log n). Heapsort zaručená složitost O(n log n), nepotřebuje pomocnou paměť. Stejně rychlý jako mergesort. 25 / 26

Náměty na domácí práci Implementujte simulátor tiskové fronty pomocí prioritní fronty. Experimentálně vyhodnoťte rychlost haldy oproti vyhledávacímu stromu (pro hledání minima). Zefektivněte probublávání, místo výměn použijte přesuny. Napište probublávání rekurzivně. Naprogramujte smazání libovolného prvku z haldy. Implementujte k regulární haldu. Jaká je časová složitost jednotlivých operací? 26 / 26