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

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

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

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

Standardní algoritmy vyhledávací.

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

Hašování. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Spojová implementace lineárních datových struktur

IB111 Úvod do programování skrze Python

Algoritmizace a programování

Algoritmy I, složitost

Datové struktury 2: Rozptylovací tabulky

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

Úvod do programovacích jazyků (Java)

Binární vyhledávací stromy II

Základy algoritmizace. Hašování

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Základy algoritmizace a programování

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

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

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

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Lineární datové struktury

Algoritmizace a programování

Časová a prostorová složitost algoritmů

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

vyhledávací stromové struktury

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

Složitosti základních operací B + stromu

Přednáška 3. Rekurze 1

Algoritmy a datové struktury

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

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

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

Dynamické datové struktury III.

Microsoft Office. Excel vyhledávací funkce

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

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Rekurzivní algoritmy

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Algoritmizace a programování

5 Přehled operátorů, příkazy, přetypování

Stromy, haldy, prioritní fronty

Binární soubory (datové, typované)

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

Lineární datové struktury

Poslední nenulová číslice faktoriálu

Úvod do programování 6. hodina

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

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

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Programování v C++, 2. cvičení

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

Jazyk C# a platforma.net

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

Digitální učební materiál

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

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

Rekurze a rychlé třídění

Matematická indukce a správnost programů. Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 13

ŘÍKÁME, ŽE FUNKCE JE ČÁSTEČNĚ SPRÁVNÁ (PARTIALLY CORRECT), POKUD KDYŽ JE SPLNĚNA PRECONDITION

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.

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Algoritmizace prostorových úloh

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

Časová složitost algoritmů

Inovace tohoto kurzu byla spolufinancována z Evropského sociálního fondu a státního rozpočtu České republiky.

IB111 Úvod do programování skrze Python

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

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

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

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

Řídicí struktury. alg3 1

2 Strukturované datové typy Pole Záznam Množina... 4

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

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

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

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

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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.

Databázové systémy. Cvičení 6: SQL

Architektura počítačů Logické obvody

Architektura počítačů Logické obvody

NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

10. Složitost a výkon

Paměť počítače. alg2 1

Da D to t v o é v ty t py IB111: Datové typy

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Vytváření a použití knihoven tříd

Tabulka. Datová struktura, která umožňuje vkládat a později vybírat informace podle identifikačního klíče. Mohou být:

5. Dynamické programování

6. Příkazy a řídící struktury v Javě

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

Základy algoritmizace a programování

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Transkript:

Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344

Osnova přednášky Vyhledávání Vyhledávání Definice problému Sekvenční vyhledávání Vyhledávání půlením intervalu Jiří Dvorský (VŠB TUO) Vyhledávání 202 / 344

Vyhledávání definice problému Základní pojmy vyhledávací prostor S, klíč, hodnota. Příklad seznam loginů studentů a jejich hodnocení v předmětu Algoritmy I, autorský katalog v knihovně, množina všech českých samohlásek. Jiří Dvorský (VŠB TUO) Vyhledávání 203 / 344

Vyhledávání jednorozměrné vyhledávání adresní vyhledávací algoritmy využívají jednoznačného vztahu mezi hodnotou klíče prvku a umístěním prvku ve struktuře reprezentující vyhledávací prostor S (přímý přístup k prvkům pole pomocí indexů, hašovací tabulky) asociativní vyhledávací algoritmy porovnávání prvků (relativní hodnota vzhledem k ostatním prvkům) při hledání prvku x S se využívají relace (porovnávání) mezi prvky struktury reprezentující S (vyhledávání v poli). Jiří Dvorský (VŠB TUO) Vyhledávání 204 / 344

Vyhledávání vícerozměrné vyhledávání nevyhledáváme jen podle jednoho klíče, ale podle více klíčů, nutnost přizpůsobit datové struktury a algoritmy, samotné vyhledávací algoritmy se dají rozdělit do tří kategorií: dotazy na úplnou shodu dotazy požadující shodu na všech klíčích. dotazy na částečnou shodu dotazy požadující shodu jen na některých složkách klíče. dotazy na intervalovou shodu dotazy požadující, aby klíč záznamu byl v určeném intervalu. Do této kategorie vlastně spadají všechny databázové systémy. Jiří Dvorský (VŠB TUO) Vyhledávání 205 / 344

Vyhledávání typické úlohy příslušnost prvku je obsažen nebo ne? Matematicky x S nebo x S hledání extrému minimum nebo maximum dotaz na shodu úplnou nebo částečnou Při konkrétní implementaci zadané úlohy existuje vzájemná souvislost mezi všemi operacemi a všechny operace závisejí na zvolené reprezentaci vyhledávacího prostoru. Jiří Dvorský (VŠB TUO) Vyhledávání 206 / 344

Vyhledávání v poli nejjednodušší paměťová struktura, přímý přístup k prvkům, typicky jednorozměrné vyhledávání (klíč, hodnota), Řešené úlohy příslušnost prvku dotaz na úplnou shodu výsledek jako logická hodnota výsledek index hledaného prvku v poli Budeme předpokládat jeden výskyt každého prvku v poli Jiří Dvorský (VŠB TUO) Vyhledávání 207 / 344

Složitost vyhledávání Prostorová složitost Konstantní jen prohledávané pole a konstantní rozsah pomocných proměnných Časová složitost Jaké operace zkoumat? Porovnání hledaného prvku s prvkem v poli. Jiří Dvorský (VŠB TUO) Vyhledávání 208 / 344

Sekvenční vyhledávání bez požadavků na prohledávané pole, prohledávané pole tedy nemusí být setříděné, algoritmus prohledává celé pole postupně testuje jednotlivé prvky pole, složitost O(n), kde n je počet prvků v prohledávaném poli. Jiří Dvorský (VŠB TUO) Vyhledávání 209 / 344

Iterativní implementace bool LinearSearch1(const int a[], const int n, const int x) for(int i = 0; i < n; i++) if (a[i] == x) return true; return false; Výsledkem je logická hodnota. Jiří Dvorský (VŠB TUO) Vyhledávání 210 / 344

Iterativní implementace int LinearSearch2(const int a[], const int n, const int x) for(int i = 0; i < n; i++) if (a[i] == x) return i; return -1; Výsledkem je index nalezeného prvku, jinak -1. Jiří Dvorský (VŠB TUO) Vyhledávání 211 / 344

Rekurzivní implementace bool LinearSearchRecursive1(const int a[], const int n, const int x, const int i) if (i == n) return false; if (a[i] == x) return true; return LinearSearchRecursive1(a, n, x, i+1); Výsledkem je logická hodnota. Jiří Dvorský (VŠB TUO) Vyhledávání 212 / 344

Rekurzivní implementace int LinearSearchRecursive2(const int a[], const int n, const int x, const int i) if (i == n) return -1; if (a[i] == x) return i; return LinearSearchRecursive2(a, n, x, i+1); Výsledkem je index nalezeného prvku, jinak -1. Jiří Dvorský (VŠB TUO) Vyhledávání 213 / 344

Vyhledávání půlením intervalu Lze zlepšit časovou složitost sekvenčního vyhledávání? Pokud o prohledávaném poli nevíme vůbec nic asi těžko? Co kdybychom pole setřídili? Budeme předpokládat, že pole je setříděno vzestupně. Potom bychom nemuseli prohledávat pole celé. Po nalezení většího prvku než je hledaný už nemá cenu dále hledat. Nešlo by počet prvků, které je nutné otestovat nějak radikálněji zmenšovat? Jiří Dvorský (VŠB TUO) Vyhledávání 214 / 344

Půlení intervalu, úspěšné hledání prvku 19 Určíme střed celého pole a srovnáme 19 s 34 Jiří Dvorský (VŠB TUO) Vyhledávání 215 / 344

Půlení intervalu, úspěšné hledání prvku 19 Určíme střed celého pole a srovnáme 19 s 34 Určíme střed úseku pole a srovnáme 19 s 16 Jiří Dvorský (VŠB TUO) Vyhledávání 216 / 344

Půlení intervalu, úspěšné hledání prvku 19 Určíme střed celého pole a srovnáme 19 s 34 Určíme střed úseku pole a srovnáme 19 s 16 Určíme střed úseku pole a srovnáme 19 s 23 Jiří Dvorský (VŠB TUO) Vyhledávání 217 / 344

Půlení intervalu, úspěšné hledání prvku 19 Určíme střed celého pole a srovnáme 19 s 34 Určíme střed úseku pole a srovnáme 19 s 16 Určíme střed úseku pole a srovnáme 19 s 23 Určíme střed úseku pole a srovnáme 19 s 19 Prvek 19 byl úspěšně nalezen! Jiří Dvorský (VŠB TUO) Vyhledávání 218 / 344

Půlení intervalu, úspěšné hledání prvku 19 Zkráceně můžeme postup hledání prvku 19 zachytit takto: Poznámka Celé pole můžeme považovat také za úsek pole, který je shodou okolností roven celému poli. Tím se nám zjednoduší další výklad a v důsledku i výsledný algoritmus. Jiří Dvorský (VŠB TUO) Vyhledávání 219 / 344

Půlení intervalu, úspěšné hledání prvku 7 Jiří Dvorský (VŠB TUO) Vyhledávání 220 / 344

Půlení intervalu, úspěšné hledání prvku 65 Jiří Dvorský (VŠB TUO) Vyhledávání 221 / 344

Půlení intervalu úsek pole Jak reprezentovat úsek pole? L index levého okraje prohledávaného úseku pole, Left R index pravého okraje prohledávaného úseku pole, Right M index středu prohledávaného úseku pole, Mid Indexy L a R Indexy L a R jsou inkluzivní první a poslední prvek úseku leží na těchto indexech. Srovnej s délkou pole a indexem posledního prvku pole v jazyku C++. Poznámka Index levého resp. pravého okraje úseku pole budeme také nazývat levou resp. pravou mezí úseku pole. Jiří Dvorský (VŠB TUO) Vyhledávání 222 / 344

Půlení intervalu výpočet středu úseku Výpočet středu úseku M = L + R L 2 = 2L + R L 2 = L + R 2 Konvence při výpočtu středu úseku Je jasná, že součet L + R nemusí být sudé číslo. Co s tím?! Dělení vždy probíhá celočíselně! Například L = 0 a R = 5. Střed je M = 2, nikoliv M = 2.5. Levá část děleného úseku tak bude o jeden prvek kratší. Pokud bychom dělili s plovoucí řádovou čárkou a zaokrouhlovali nahoru, jak je obvyklé, dosáhli bychom jedině toho, že levá část by byla o jeden prvek delší než pravá. Jiří Dvorský (VŠB TUO) Vyhledávání 223 / 344

Půlení intervalu, úspěšné hledání prvku 19 Úseky pole Indexy L R M 0 12 6 0 5 2 3 5 4 3 3 3 Posun doleva Nová hodnota L beze změny R M 1 Posun doprava Nová hodnota L M + 1 R beze změny Jiří Dvorský (VŠB TUO) Vyhledávání 224 / 344

Půlení intervalu, neúspěšné hledání prvku 55 Určíme střed celého pole a srovnáme 55 s 34 Určíme střed úseku pole a srovnáme 55 s 52 Určíme střed úseku pole a srovnáme 55 s 61 Určíme střed úseku pole a srovnáme 55 s 56 Prvek 55 nebyl nalezen! Jiří Dvorský (VŠB TUO) Vyhledávání 225 / 344

Půlení intervalu, neúspěšné hledání prvku 55 Jak rozpoznat konec u neúspěšného hledání? Konec rozpoznáme snadno úsek obsahuje jen jeden prvek a není to ten, který hledáme. Ale! Při úspěšném hledání prvku 19 jsme taky skončili u jednoprvkového úseku. Jsou tedy jednoprvkové úseky nějakou zvláštností? Proč by měly? Takže bychom měli vyhledávání ukončit až úsek zkrátíme na jeden prvek? A když se u více prvkového úseku trefíme tak, že hledaný prvek bude přímo ve středu. To bychom mohli skončit rovnou, ne? Takže redukce na jeden prvek není asi nutná. A opačná otázka? Jak poznám, že mám ve vyhledávání naopak stále pokračovat? Jiří Dvorský (VŠB TUO) Vyhledávání 226 / 344

Půlení intervalu, invariant algoritmu Při výpočtu středu úseku předpokládáme, že R L! M = L + R L 2 Otázka zní, platí tento předpoklad po celou dobu vykonávání algoritmu? A pokud toto neplatí, kdy je předpoklad porušen? Invariant algoritmu Invariant je podmínka v algoritmu, která musí být splněna po celou dobu vykonávání algoritmu. Invariant algoritmu vyhledávání půlením intervalu V našem případě musí vždy platit, že R L. Jiří Dvorský (VŠB TUO) Vyhledávání 227 / 344

Půlení intervalu, neúspěšné hledání prvku 55 Úseky pole Prvek 55 je menší než 56, pokračujeme levou částí Indexy L R M 0 12 6 7 12 9 10 12 11 10 10 10 10 9 Porušení invariantu algoritmu Levá mez je větší než pravá. Došlo k překřížení mezí. Jiří Dvorský (VŠB TUO) Vyhledávání 228 / 344

Rekurzivní implementace bool BinarySearchRecursive1(const int a[], const int l, const int r, const int x) if (l > r) return false; int m = (l + r)/2; if (x == a[m]) return true; if (x < a[m]) return BinarySearchRecursive1(a, l, m - 1, x); return BinarySearchRecursive1(a, m + 1, r, x); Výsledkem je logická hodnota. Jiří Dvorský (VŠB TUO) Vyhledávání 229 / 344

Rekurzivní implementace bool BinarySearchRecursive1a(const int a[], const int l, const int r, const int x) if (l > r) return false; int m = (l + r)/2; if (x == a[m]) return true; return x < a[m]? BinarySearchRecursive1a(a, l, m - 1, x ) : BinarySearchRecursive1a(a, m + 1, r, x); Místo příkazu if použit ternární operátor. Jiří Dvorský (VŠB TUO) Vyhledávání 230 / 344

Rekurzivní implementace int BinarySearchRecursive2(const int a[], const int l, const int r, const int x) if (l > r) return -1; int m = (l + r)/2; if (x == a[m]) return m; if (x < a[m]) return BinarySearchRecursive2(a, l, m - 1, x); return BinarySearchRecursive2(a, m + 1, r, x); Výsledkem je index nalezeného prvku, jinak -1. Jiří Dvorský (VŠB TUO) Vyhledávání 231 / 344

Rekurzivní implementace int BinarySearchRecursive3(const int a[], const int l, const int r, const int x) if (l > r) return ~l; int m = (l + r)/2; if (x == a[m]) return m; if (x < a[m]) return BinarySearchRecursive3(a, l, m - 1, x); return BinarySearchRecursive3(a, m + 1, r, x); Výsledkem je index nalezeného prvku, jinak bitový doplněk správné pozice. Jiří Dvorský (VŠB TUO) Vyhledávání 232 / 344

Iterativní implementace bool BinarySearch1(const int a[], const int n, const int x) int l = 0; int r = n - 1; while (l <= r) int m = (l + r)/2; if (x == a[m]) return true; if (x < a[m]) r = m - 1; else l = m + 1; return false; Výsledkem Jiří Dvorský (VŠB je logická TUO) hodnota. Vyhledávání 233 / 344

Iterativní implementace int BinarySearch2(const int a[], const int n, const int x) int l = 0; int r = n - 1; while (l <= r) int m = (l + r)/2; if (x == a[m]) return m; if (x < a[m]) r = m - 1; else l = m + 1; return -1; Výsledkem Jiří Dvorský (VŠB je index TUO) nalezeného prvku, Vyhledávání jinak -1. 234 / 344

Iterativní implementace int BinarySearch3(const int a[], const int n, const int x) int l = 0; int r = n - 1; while (l <= r) int m = (l + r)/2; if (x == a[m]) return m; if (x < a[m]) r = m - 1; else l = m + 1; return ~l; Výsledkem Jiří Dvorský (VŠB je index TUO) nalezeného prvku, Vyhledávání jinak bitový doplněk správné pozice. 235 / 344

Děkuji za pozornost Jiří Dvorský (VŠB TUO) Vyhledávání 236 / 344