vyhledávací algoritmy Brute Force Binary Search Interpolation Search indexové soubory Dense index, Sparse index transformační funkce Perfect Hash, Close Hash Table, Open Hash Table vyhledávací stromové struktury binary tree, digi tree, BST, B tree, AVL tree, R B tree, Trie, 1
Co potřebujeme zjistit? funkce: čas potřebný pro nalezení/nenalezení záznamu s danou hodnotou klíče ( ) čas potřebný pro přidání záznamu (uspořádání vstupních dat) čas potřebný pro odebrání záznamu (logicky/fyzicky), čas potřebný pro nalezení 1. záznamu, n tého záznamu, čas potřebný pro nalezení předchozího záznamu, následujícího záznamu» má smysl jen v některých případech funkce: hledáme záznam s hodnotou klíče hledáme takové i, kde 0 pro které platí:» hledáme všechna taková i přidáváme záznam s hodnotou klíče nesmí být porušena organizace vstupního souboru (setřídění, struktura) odebíráme záznam s hodnotou klíče záznam musíme nejdříve nalézt» tj. +??? mazání logické nebo fyzické (pokud to jde) 2
vyhledávání hrubou silou lineární vyhledávání (linear search) sekvenční vyhledávání nejjednodušší způsob vyhledávání nepředpokládá žádnou organizaci dat na vstupu nulová chytrost algoritmu prochází posloupnost klíčů od začátku do konce doplňuje ostatní vyhledávací algoritmy vyhledání záznamů s duplicitní hodnotou klíče vstupní soubor určitým způsobem organizován (setříděn) binární vyhledávání vyhledávání pomocí bisekce (bisection search) vyhledávání půlením intervalu (half interval search) nejběžnější způsob vyhledávání předpokládá na vstupu setříděnou posloupnost záznamů využívá numerickou metodu půlení intervalu v každém kroku je eliminována ta část souboru, kde se hledaný klíč určitě nevyskytuje 3
interpolační vyhledávání vyhledávání pomocí lineární interpolace extrapolační vyhledávání (extrapolation search) další, rychlejší způsob vyhledávání předpokládá na vstupu setříděnou posloupnost záznamů pro vyhledávání využívá numerickou metodu interpolace, tj. metodu regula falsi (metoda sečen) v každém kroku je eliminována ta část pole, kde se hledaný klíč určitě nevyskytuje obtížnější výpočet (vhodné pro třídění neindexovaných dat na disku) pouze pro unikátní hodnoty klíčů předpokládá rovnoměrné rozložení hodnot klíčů Algoritmus: pro 0,1,2,, 1 porovnáme s hledaným pokud, pak algoritmus končí nalezením záznamu» v případě duplicitních hodnot pokračujeme v hledání až do konce pokud, pak pokračujeme v hledání pro 1 4
Algoritmus: porovnáme krajní hodnoty tj. s hledaným a s hledaným není nutné pro 0a 1 spočteme index porovnáme s hledaným pokud, pak algoritmus končí nalezením záznamu» v případě duplicitních hodnot pokračujeme v hledání Brute Force pokud, pak pokračujeme v hledání pro» tj. budeme pokračovat v hledání na intervalu, pokud, pak pokračujeme v hledání pro» tj. budeme pokračovat v hledání na intervalu, Algoritmus: porovnáme krajní hodnoty tj. s hledaným a s hledaným není nutné pro 0a 1 spočteme index porovnáme s hledaným pokud, pak algoritmus končí nalezením záznamu pokud, pak pokračujeme v hledání pro 1» tj. budeme pokračovat v hledání na intervalu, pokud, pak pokračujeme v hledání pro 1» tj. budeme pokračovat v hledání na intervalu, 5
Kdy hledání ukončit? nalezením záznamu se stejným klíčem najdu i, pro které platí v tomto případě platí: 0 1 Problém: duplicitní hodnoty klíčů nutné prohledat celý soubor záznamů ( ),» odfláknuté vyhledávání nedoporučuje se, nenalezením záznamu se stejným klíčem prohledávání skončí neúspěchem nutné informovat o nenalezení v tomto případě platí: Problém: nastavit se na určitý záznam v souboru s podobným klíčem nesetříděný soubor: nastavit na konec souboru Kdy hledání ukončit? nalezením záznamu se stejným klíčem najdu s, pro které platí v tomto případě platí: 1 Problém: duplicitní hodnoty klíčů nutné dohledat další záznamy (Brute Force) oběma směry,» odfláknuté vyhledávání nedoporučuje se nenalezením záznamu se stejným klíčem prohledávání skončí neúspěchem nutné informovat o nenalezení v tomto případě platí: 1 Problém: nastavit se na určitý záznam v souboru s podobným klíčem setříděný soubor: nastavit na předchozí nebo následující pozici» Co v případě nebo? 6
Kdy hledání ukončit? nalezením záznamu se stejným klíčem najdu s, pro které platí v tomto případě platí: 1 Problém: duplicitní hodnoty klíčů NEDOPORUČUJE SE: narušuje rovnoměrné rozdělení hodnot klíčů nenalezením záznamu se stejným klíčem prohledávání skončí neúspěchem nutné informovat o nenalezení v tomto případě platí: 1 Problém: nastavit se na určitý záznam v souboru s podobným klíčem setříděný soubor: nastavit na předchozí nebo následující pozici» Co v případě nebo? 0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 17 0 1 1 3 2 5 atd. 8 17 duplicita klíčů = pokračujeme dál v prohledávání až do konce 7
0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 8 0 1 1 3 2 5 atd. 12 25 prohledán celý vstup 0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 17 0 1 12 25 0, 12 0 12 2 6 13 6, 12 6 12 2 9 19 6, 9 2 7 15 7, 9 2 8 17 8
0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 8 0 1 12 25 0, 12 0 12 2 6 13 0, 6 2 3 7 3, 6 2 4 9 3, 4 1 0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 17 0 1 12 25 0, 12 0 17 1 12 0 25 1 8 17 9
0 1 2 3 4 5 6 7 8 9 10 11 12 1 3 5 7 9 11 13 15 17 19 21 23 25 8 0 1 12 25 0, 12 0 8 1 12 0 25 1 3,5 7 3, 12 3 8 7 12 3 25 7 3,5 vstupní soubor nesetříděný nalezený záznam fyzicky zrušit (přepsat) okamžitý posun všech následujících záznamů» ČASOVĚ NÁROČNÉ: 1 nalezený záznam nahradit jiným záznamem (poslední v souboru) záznamy musí mít pevnou délku» 1 setříděný nalezený záznam logicky zrušit (označit ke smazání) označit neexistující hodnotou klíče / přidat mazací bit» 1 evidence % zrušených záznamů (fronta)» občas nutné spustit setřásající algoritmus: 10
vstupní soubor nesetříděný vložíme záznam na konec souboru záznamy mohou mít různou délku» 1» Delete: záznamy musí mít pevnou délku setříděný vložíme záznam na konec souboru + Sort Sort: nutné po každém vložení záznamu, celý vstupní soubor» ČASOVĚ NÁROČNÉ: 1 1» 1 vstupní soubor setříděný vložíme záznam na pozice záznamů určených pro smazání záznamy musí mít pevnou délku» 1 nutná evidence zrušených záznamů (fronta)» nutné občas spustit setřásající algoritmus, tj. Search: nutné prohledávat i frontu rušených záznamů (Brute Force) vložíme záznam na pozice mimo soubor do oblasti přetečení udržuje se sekvenčně (Brute Force) záznamy mohou mít různou délku» 1» nutné občas spustit přirozený třídící algoritmus, tj. Search: nutné prohledávat i oblast přetečení (Brute Force) 11
pozitiva jednoduchá realizace pouze jeden cyklus negativa nejpomalejší 1 1 1 1 n T(n) 10 1 10 10 2 1 100 10 3 1 1 000 10 4 1 10 000 10 5 1 100 000 10 6 1 1 000 000 pozitiva nejčastější negativa setříděná data 1 log n T(n) 10 1 4 10 2 1 7 10 3 1 10 1 1 1 1 10 4 1 14 10 5 1 17 10 6 1 20 12
pozitiva méně časté negativa setříděná data, unikátní klíče 1 log log n T(n) 10 1 2 10 2 1 3 10 3 1 4 1 1 1 1 10 4 1 4 10 5 1 5 10 6 1 5 pozitiva nejrychlejší negativa setříděná data, unikátní klíče 1 log log log n T(n) 10 1 1 10 2 1 2 10 3 1 2 1 1 1 1 10 4 1 2 10 5 1 3 10 6 1 3 Lepší už to nebude! 13