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

Podobné dokumenty
Spojový seznam. Jan Kybic.

Rekurze a rychlé třídění

Prioritní fronta, halda

Algoritmizace prostorových úloh

IB111 Úvod do programování skrze Python

5. Vyhledávání a řazení 1

Základy řazení. Karel Richta a kol.

Sada 1 - Základy programování

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

IB111 Úvod do programování skrze Python

Algoritmizace řazení Bubble Sort

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

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) {

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

Stromy. Jan Kybic.

Časová složitost / Time complexity

Základy algoritmizace a programování

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

Standardní algoritmy vyhledávací.

Maturitní téma: Programovací jazyk JAVA

IB111 Úvod do programování 1 / 62

Algoritmy I. Třídění ALGI 2010/2011

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

IB111 Základy programování Radek Pelánek 1 / 61

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

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

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort.

Bubble sort. příklad. Shaker sort

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

Programování v Pythonu

Algoritmy I, složitost

vyhledávací stromové struktury

Konečný automat. Jan Kybic.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Složitost UPR 2008/09 1

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

Dynamic programming. Optimal binary search tree

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í

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

Základy algoritmizace. Hašování

Algoritmy a datové struktury

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

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

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

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

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Časová složitost algoritmů

Algoritmy vyhledávání a řazení. Zatím nad lineární datovou strukturou (polem)

Rozptylovací tabulky

Úvod do programování 6. hodina

Algoritmizace a programování

Dynamické datové struktury III.

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

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

Programování v Pythonu

10. Složitost a výkon

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

Dynamické programování

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

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

Algoritmy na ohodnoceném grafu

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

3 Vyhledávání, třídící algoritmy

TGH07 - Chytré stromové datové struktury

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

Rekurentní rovnice, strukturální indukce

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Pole a kolekce. v C#, Javě a C++

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

TGH05 - Problém za milion dolarů.

Hledání k-tého nejmenšího prvku

Anotace. pointery (pars prima). Martin Pergel,

Šablony, kontejnery a iterátory

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Různé algoritmy mají různou složitost

Časová složitost algoritmů, řazení a vyhledávání

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

Zadání k 2. programovacímu testu

Techniky návrhu algoritmů

Stromy, haldy, prioritní fronty

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

Programování v Pythonu

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Praktická cvičení algoritmů

PG 9.5 novinky ve vývoji aplikací

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Vyhodnocování dotazů slajdy k přednášce NDBI001. Jaroslav Pokorný MFF UK, Praha

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

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

Základní informace o předmětu Otázka:

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Elegantní algoritmus pro konstrukci sufixových polí

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Datové struktury 2: Rozptylovací tabulky

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Transkript:

Třídění a vyhledávání Searching and sorting Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 1 / 33

Vyhledávání Třídění Třídící algoritmy 2 / 33

Vyhledávání Searching Mějme posloupnost (pole) a 0,..., a N 1 Mějme hodnotu q Úkol: zjistit, zda existuje a i = q 3 / 33

Vyhledávání Searching Mějme posloupnost (pole) a 0,..., a N 1 Mějme hodnotu q Úkol: zjistit, zda existuje a i = q Varianty Výstup: ano/ne nebo pozice Hledání opakujeme mnohokrát pro stejné a předzpracování Posloupnost a je setříděná. Stochastické hledání 3 / 33

Vyhledávání v Pythonu operátor in Obsahuje pole daný prvek? >>> a=[17,20,26,31,44,77,65,55,93] >>> 20 in a True >>> 30 in a False >>> 30 not in a True >>> 20 not in a False 4 / 33

Vyhledávání v Pythonu (2) in / not in funguje i pro řetězce, n-tice a podobné typy (containers) >>> "omo" in "Olomouc" # podřetězec True >>> "" in "Olomouc" # prázdný řetězec True >>> "olo" in "Olomouc" # rozlišuje velká/malá písmena False >>> 4 in (3,4) True >>> 3. in (3,4) # na typu nezáleží True 5 / 33

Lineární vyhledávání linear/sequential search Procházíme postupně a než narazíme na q def sequential_search(a,q): """ Returns True if a contains q """ for x in a: if x==q: return True return False Image from Miller & Ranum: Problem solving with algothms and data structures 6 / 33

Lineární vyhledávání linear/sequential search Procházíme postupně a než narazíme na q def sequential_search(a,q): """ Returns True if a contains q """ for x in a: if x==q: return True return False Počet porovnání: nejméně nejvíce průměrně q a N N N q a 1 N N/2 Složitost O(N), kde N=len(a). Rychleji to nejde, protože na každý prvek a i se musíme podívat. 6 / 33

Lineární vyhledávání empirická složitost 0.30 0.25 0.20 seq in seq not in Python in Python not in time [s] 0.15 0.10 0.05 0.00 0 500000 1000000 1500000 2000000 2500000 3000000 n Soubor search_experiments.py 7 / 33

Binární vyhledávání Binary search Vyhledávání v setříděné posloupnosti Mějme posloupnost (pole) a 1 a 2 a 3 a N 1 a N Mějme hodnotu q Úkol: zjistit, zda existuje a i = q Je vyhledávání v setříděném poli rychlejší? 8 / 33

Binární vyhledávání Binary search Hlavní myšlenky Postupně zmenšujeme interval indexů, kde by mohlo ležet q V každém kroku porovnáme q s prostředním prvkem intervalu a podle toho zvolíme jeden z podintervalů. Skončíme, pokud je prvek nalezen, nebo pokud je podinterval prázdný. Image from Miller & Ranum: Problem solving with algothms and data structures 8 / 33

Binární vyhledávání implementace def binary_search(a,q): l=0 # first index of the subinterval h=len(a)-1 # last index of the subinterval while l<=h: m=(l+h)//2 # middle point if a[m]==q: return True if a[m]>q: h=m-1 else: l=m+1 return False 9 / 33

Binární vyhledávání časová složitost Počet porovnání Počet prvků v intervalu je d = h l + 1 a v první iteraci d = N V každé iteraci se interval d zmenší nejméně na polovinu Po t iteracích je d N2 t Dokud algoritmus běží, musí platit d 1, 1 d N2 t N 2 t t log 2 N Počet porovnání t log 2 N Složitost O(log n) Strategie rozděl a panuj (Divide and conquer) 10 / 33

Binární vyhledávání empirická složitost 0.000018 0.000016 binary in binary not in 0.000014 time [s] 0.000012 0.000010 0.000008 0.000006 0 500000 1000000 1500000 2000000 2500000 3000000 n Soubor search_experiments.py 11 / 33

Binární vs. sekvenční vyhledávání 10 0 10-1 seq in seq not in binary in binary not in 10-2 time [s] 10-3 10-4 10-5 10-6 10 3 10 4 10 5 10 6 10 7 n Vyplatí se, pokud mnohokrát vyhledáváme nad stejným a. 12 / 33

Vyhledávání Třídění Třídící algoritmy 13 / 33

Třídění Sorting Mějme posloupnost (pole) A = [ a 0,..., a N 1 ] a relaci Najděte takovou permutaci B = [ b 0,..., b N 1 ] pole A, aby b 0 b 1 b N 1. Poznámky: Formy výstupu: Třídění na místě (in place) Vytvoření nového pole B, pole A zůstává nezměněno. Najdeme indexy j1, j 2,..., j N, tak aby b i = a ji (a[j[i]]) Stabilní třídění zachovává pořadí ekvivalentních prvků. 14 / 33

Třídění v Pythonu Funkce sorted vrací nové setříděné pole >>> a=[80,43,20,15,90,67,51] >>> sorted(a) [15, 20, 43, 51, 67, 80, 90] Metoda sort setřídí pole na místě (úspornější) >>> a.sort() >>> a [15, 20, 43, 51, 67, 80, 90] 15 / 33

Třídění v Pythonu Funkce sorted vrací nové setříděné pole >>> a=[80,43,20,15,90,67,51] >>> sorted(a) [15, 20, 43, 51, 67, 80, 90] Metoda sort setřídí pole na místě (úspornější) >>> a.sort() >>> a [15, 20, 43, 51, 67, 80, 90] Třídění sestupně >>> sorted(a,reverse=true) [90, 80, 67, 51, 43, 20, 15] 15 / 33

Třídění řetězců Lze třídit veškeré porovnatelné typy, například řetězce >>> names=["barbora","adam","david","cyril"] >>> sorted(names) [ Adam, Barbora, Cyril, David ] 16 / 33

Třídění řetězců Lze třídit veškeré porovnatelné typy, například řetězce >>> names=["barbora","adam","david","cyril"] >>> sorted(names) [ Adam, Barbora, Cyril, David ] Třídění není podle českých pravidel print(sorted(["pan","paze"])) ['pan', 'paze'] print(sorted(["pán","paže"])) ['paže', 'pán'] 16 / 33

Třídění n-tic n-tice jsou tříděny postupně podle složek >>> a=[(50,2),(50,1),(40,100),(40,20)] >>> sorted(a) [(40, 20), (40, 100), (50, 1), (50, 2)] 17 / 33

Třídění n-tic n-tice jsou tříděny postupně podle složek >>> a=[(50,2),(50,1),(40,100),(40,20)] >>> sorted(a) [(40, 20), (40, 100), (50, 1), (50, 2)] >>> studenti=[("bara",18),("adam",20),... ("David",15),("Cyril",25)] >>> sorted(studenti) [( Adam, 20), ( Bara, 18), ( Cyril, 25), ( David, 15)] 17 / 33

Uživatelská třídící funkce Funkce v parametru key transformuje prvky pro třídění. Třídení podle druhé složky dvojice >>> a=[(50,2),(50,1),(40,100),(40,20)] >>> sorted(a,key=lambda x: x[1]) [(50, 1), (50, 2), (40, 20), (40, 100)] >>> studenti=[("bara",18),("adam",20),... ("David",15),("Cyril",25)] >>> sorted(studenti,key=lambda x: x[1]) [( David, 15), ( Bara, 18), ( Adam, 20), ( Cyril, 25)] 18 / 33

Uživatelská třídící funkce (2) Třídění bez ohledu na velikost písmen >>> s=["python","quido","abeceda","zahrada"] >>> sorted(s) [ Python, Quido, abeceda, zahrada ] >>> sorted(s,key=lambda x: x.lower()) [ abeceda, Python, Quido, zahrada ] 19 / 33

Vyhledávání Třídění Třídící algoritmy 20 / 33

Třídící algoritmy Třídění probubláváním (bubble sort) Třídění zatřiďováním (insertion sort) Třídění výběrem (selection sort) Shell sort Třídění spojováním (merge sort) Quick sort sort, sorted 21 / 33

Řazení probubláváním Bubble sort Vyměňuje sousední prvky ve špatném pořadí. Jeden průchod: Image from Miller & Ranum: Problem solving with algothms and data structures 22 / 33

Řazení probubláváním implementace Bubble sort def bubble_sort(a): """ sorts array a in-place in ascending order""" for i in range(len(a)-1,0,-1): # i=n-1..1. a[i+1:] is already sorted for j in range(i): if a[j]>a[j+1]: a[j],a[j+1]=a[j+1],a[j] # exchange 23 / 33

Řazení probubláváním implementace Bubble sort def bubble_sort(a): """ sorts array a in-place in ascending order""" for i in range(len(a)-1,0,-1): # i=n-1..1. a[i+1:] is already sorted for j in range(i): if a[j]>a[j+1]: a[j],a[j+1]=a[j+1],a[j] # exchange Složitost Vnější smyčka proběhne N 1 N-krát Vnitřní smyčka proběhne vždy i-krát, kde i < N, tedy max. N-krát Počet porovnání je tedy max. N 2 složitost O(N 2 ) Počet výměn je velký, element musí probublat nakonec 23 / 33

Řazení probubláváním vylepšení Pokud neproběhla žádná výměna, je pole setříděné. def bubble_sort(a): """ sorts array a in-place in ascending order""" for i in range(len(a)-1,0,-1): # i=n-1..1. a[i+1:] is already sorted exchanged=false # exchanges in this iteration? for j in range(i): if a[j]>a[j+1]: a[j],a[j+1]=a[j+1],a[j] # exchange exchanged=true if not exchanged: break 24 / 33

Třídění probubláváním kontrola >>> a=[31, 60, 23, 91, 62, 65, 59, 92, 42, 74] >>> bubble_sort(a) >>> a [23, 31, 42, 59, 60, 62, 65, 74, 91, 92] 25 / 33

Třídění probubláváním kontrola >>> a=[31, 60, 23, 91, 62, 65, 59, 92, 42, 74] >>> bubble_sort(a) >>> a [23, 31, 42, 59, 60, 62, 65, 74, 91, 92] Správný test je důkladnější: def test_sort(f=bubble_sort): for j in range(100): n=100 a=[random.randrange(100000) for i in range(n)] f(a) for i in range(n-1): assert(a[i]<=a[i+1]) print(f. name," sort test passed") 25 / 33

Třídění zatřiďováním Insertion sort Prvek a i zatřídíme do již setříděných a 0,..., a i 1 26 / 33

Třídění zatřiďováním implementace Insertion sort def insertion_sort(a): """ sorts array a in-place in ascending order""" for i in range(1,len(a)): # a[0:i] is sorted val=a[i] j=i while j>0 and a[j-1]>val: a[j]=a[j-1] j-=1 a[j]=val 27 / 33

Třídění zatřiďováním implementace Insertion sort def insertion_sort(a): """ sorts array a in-place in ascending order""" for i in range(1,len(a)): # a[0:i] is sorted val=a[i] j=i while j>0 and a[j-1]>val: a[j]=a[j-1] j-=1 a[j]=val Složitost Vnější smyčka proběhne N 1 N-krát. Vnitřní smyčka proběhne max. i < N krát. Počet porovnání je tedy max. N 2 složitost O(N 2 ). Nepoužívá výměny, ale posun (rychlejší). Přirozeně detekuje setříděné pole. 27 / 33

Třídění zatřiďováním kontrola >>> a=[43, 22, 42, 7, 58, 85, 48, 82, 80, 1] >>> insertion_sort(a) >>> a [1, 7, 22, 42, 43, 48, 58, 80, 82, 85] 28 / 33

Třídění výběrem Selection sort Vybere maximum mezi a 0,..., a N 1, to umístí do a N 1. Vybere maximum mezi a 0,..., a N 2, to umístí do a N 2... 29 / 33

Třídění výběrem implementace Selection sort def selection_sort(a): """ sorts array a in-place in ascending order""" for i in range(len(a)-1,0,-1): # find out what should go to a[i] max_pos=0 # index of the maximum for j in range(1,i+1): if a[j]>a[max_pos]: max_pos=j a[i],a[max_pos]=a[max_pos],a[i] 30 / 33

Třídění výběrem implementace Selection sort def selection_sort(a): """ sorts array a in-place in ascending order""" for i in range(len(a)-1,0,-1): # find out what should go to a[i] max_pos=0 # index of the maximum for j in range(1,i+1): if a[j]>a[max_pos]: max_pos=j a[i],a[max_pos]=a[max_pos],a[i] Složitost Vnější smyčka proběhne N 1 N-krát Vnitřní smyčka proběhne vždy i-krát, kde i < N, tedy max. N-krát Počet porovnání je tedy max. N složitost O(N 2 ) Pouze jedna výměna v každé vnější smyčce 30 / 33

Třídění výběrem kontrola >>> a=[60, 46, 31, 69, 45, 11, 43, 14, 61, 36] >>> selection_sort(a) >>> a [11, 14, 31, 36, 43, 45, 46, 60, 61, 69] 31 / 33

Porovnání rychlosti Náhodná pole 30 25 20 bubble_sort selection_sort insertion_sort python_sort time [s] 15 10 5 0 0 2000 4000 6000 8000 10000 N 32 / 33

Porovnání rychlosti Náhodná pole 10 2 10 1 10 0 bubble_sort selection_sort insertion_sort python_sort time [s] 10-1 10-2 10-3 10-4 10 2 10 3 10 4 N 32 / 33

Porovnání rychlosti Setříděné pole 16 14 12 bubble_sort selection_sort insertion_sort python_sort 10 time [s] 8 6 4 2 0 0 2000 4000 6000 8000 10000 N 33 / 33

Porovnání rychlosti Setříděné pole 10 2 10 1 10 0 bubble_sort selection_sort insertion_sort python_sort time [s] 10-1 10-2 10-3 10-4 10-5 10 2 10 3 10 4 N 33 / 33