Syntax highlighting of Archiv/TIN066 Vyhledávání v setříděné posloupnosti

{{TIN066 Skripta}}

Množina S je reprezentována v setříděném poli A (délky n), hledáme daný prvek; mám ''kraje'' d, h, vím, že hledaný prvek x je <math>A[d] \le x \le A[h]</math>.  Kraje postupně přibližuji k sobě, když se potkají, našel jsem prvek.

Zaveďme si pomocnou operaci NEXT, ta vrátí novou hodnotu kraje (kterého? snadno poznáme porovnáním). Podle konkrétní podoby NEXT rozlišujeme několik druhů vyhledávání:

* '''unární''': NEXT := d+1. Prostě jedeme popořadě, očekávaný počet dotazů je n/2, ale nejhorší n, tedy to trvá <math>O(n)</math>. 
* '''binární''': NEXT := <math>\left\lceil {d+h \over 2} \right\rceil</math>. Půlíme interval. Očekávaný i nejhorší počet dotazů je <math>O(\log n)</math>.
* '''interpolační''': NEXT := <math>d + \left\lceil(h - d){x - A[d] \over A[h] - A[d]}\right\rceil</math>. Přes kraje protáhneme přímku a píchneme tam, kde by na ní mělo být x. Očekávaný počet dotazů je kdovíproč <math>O(\log \log n)</math> (nedokazuje se), nejhorší <math>O(n/2)</math>.
 
== Zobecněné kvadratické vyhledávání ==

...je taková strašlivá zdivočelost. Chtěli bychom zkombinovat binární a interpolační vyhledávání tak, abychom měli pěknou očekávanou i nejhorší složitost. Myšlenka spočívá v tom, že si vždy v našem rozsahu interpolačním dotazem vytyčíme výchozí bod hledání, postavíme velikost unárního skoku <math>c=\sqrt{h-d+1}</math>, a z výchozího bodu pak střídavě putujeme binárními a unárními dotazy ve směru x, dokud není unární skok větší než velikost úseku - v té chvíli znovu položíme interpolační dotaz, atd.

Co na to složitost? V nejhorším případě se rozdíl h-d sníží na polovinu během tří kroků, to znamená <math>O(\log n)</math>. Očekávaná složitost je očekávaný počet intepolačních dotazů krát očekávaný počet dotazů v jednom interpolačním kroku. To prvé již víme že je <math>O(\log \log n)</math>, ukazuje se, že to druhé je konstantní! Takže očekávaná složitost je <math>O(\log \log n)</math>.

Idea konstantnosti: Zjistíme, že počet prvků na začátku úseku menších než x sleduje binomické rozdělení; známe i jeho rozptyl atd., tedy můžeme použít Čebyševovu nerovnost, ta nám dá řadu <math>1/i^2</math>, jejíž součet je z analýzy konečný.

{{TODO|důkaz pořádně}}