<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.512.cz/skins/common/feed.css?301"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>https://www.512.cz/index.php?feed=atom&amp;target=212.158.144.250&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2F212.158.144.250</id>
		<title>FAV wiki - Příspěvky uživatele [cs]</title>
		<link rel="self" type="application/atom+xml" href="https://www.512.cz/index.php?feed=atom&amp;target=212.158.144.250&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2F212.158.144.250"/>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Speci%C3%A1ln%C3%AD:P%C5%99%C3%ADsp%C4%9Bvky/212.158.144.250"/>
		<updated>2026-10-23T05:10:33Z</updated>
		<subtitle>Z FAV wiki</subtitle>
		<generator>MediaWiki 1.17.0</generator>

	<entry>
		<id>https://www.512.cz/index.php?title=Tabulky_s_rozpt%C3%BDlen%C3%BDmi_polo%C5%BEkami,_vyhled%C3%A1v%C3%A1n%C3%AD_v_tabulk%C3%A1ch</id>
		<title>Tabulky s rozptýlenými položkami, vyhledávání v tabulkách</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Tabulky_s_rozpt%C3%BDlen%C3%BDmi_polo%C5%BEkami,_vyhled%C3%A1v%C3%A1n%C3%AD_v_tabulk%C3%A1ch"/>
				<updated>2014-06-13T06:35:53Z</updated>
		
		<summary type="html">&lt;p&gt;212.158.144.250: /* Otevřené rozptýlení - hash funkce */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To samé jako PPA2 14 a 15,&lt;br /&gt;
&lt;br /&gt;
jen doplňky/opakování/upřesnění:&lt;br /&gt;
&lt;br /&gt;
'''Vnitřní zřetězen'''í - synonyma (položky s kolizemi) se ukládají do volných míst&lt;br /&gt;
&lt;br /&gt;
'''Vnější zřetězení''' - synonyma se ukládají do seznamů pod klíči&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otevřené rozptýlení - hash funkce ==&lt;br /&gt;
&lt;br /&gt;
Kolize:&lt;br /&gt;
&lt;br /&gt;
1) nedefinované chování při kolizi - nutno dodefinovat&lt;br /&gt;
&lt;br /&gt;
2) lineární posun - při kolizi vkládáme na první volné místo lineárně (na indexech 1,2,3,4 od původní polohy&lt;br /&gt;
&lt;br /&gt;
3) kvadratický posun - při kolizi hledáme první volné místo na indexech podle kvadratické funkce (vzdálenosti 1, 4, 9, 16...)&lt;br /&gt;
&lt;br /&gt;
4) opakovaný hash - hashovací fci použijeme víckrát pokud dojde ke kolizi&lt;br /&gt;
&lt;br /&gt;
Pro rovnoměrné rozptýlení prvků v tabulce se rozptylová funkce skládá ze dvou částí. Například když máme rozdělovat do tabulky podle počátečních písmen jmen -&amp;gt; 26 písmen, ale od Q moc jmen není. Modulární rozptylová funkce se vynásobí multiplikativní konstantou. Konstanta ''c'' je z intervalu ''0 ≤ c &amp;lt; 1''. Příkladem takové funkce potom je ''H(m,k)=0,97 * k mod m'', kde ''k'' je klíč a ''m'' velikost pole.&lt;br /&gt;
&lt;br /&gt;
== Uzavřené rozptýlení - přímé adresování ==&lt;br /&gt;
&lt;br /&gt;
metody 2) a 3) nejsou vhodné, vzniká shlukování (clustering), proto je dobré použít způsob 4) nebo lepší hash funkci&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tabulky s uzavřeným rozptýlením a vnějším zřetězením ==&lt;br /&gt;
&lt;br /&gt;
= kombinace obou&lt;br /&gt;
&lt;br /&gt;
- adresujeme přímo, při kolizi si ale do tabulky na konec uložíme, kam budeme vnitžně zřetězovat. Hash funkce tedy může být při kolizi (třeba náhodná), nebo tabulku rozdělíme na 2 části, jednu pro vyhledávání klíčů, a druhou pro ukládání synonym. ta už může být dynamicky alokovaná.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metoda rozptýlených indexů ==&lt;br /&gt;
&lt;br /&gt;
To co bylo v předchozím případě v tabulce vyjmeme, a vytvoříme vedle. Uděláme si mapu synonym (synonyma v seznamu pro každý klíč) a tyto pak ukazují na index do pole.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyhledávání ==&lt;br /&gt;
&lt;br /&gt;
Má samozřejmě smysl jen pokud nemáme orákulum (= hashovací fci). Pokud orákulum máme, není třeba hledat protože ideální orákulum vždy ví, kam se podívat pro správná data  (The all-knowing Oracle is never surprised. How can she be, she knows everything. -- The Matrix: Revolution), reálné ví aspoň kde hledat.&lt;br /&gt;
&lt;br /&gt;
Jelikož je při přímém adresování orákulum pouhý index do tabulky (mno, to moc orákulum není, orákulum vždy ví, kam jít, aby nebyla kolize), alespoň nám napoví odkud hledat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sekvenční:'''&lt;br /&gt;
&lt;br /&gt;
Hledáme klíč lineárně, pokud na něj narazíme, vrátíme hodnotu&lt;br /&gt;
&lt;br /&gt;
+ snadná implementace&lt;br /&gt;
&lt;br /&gt;
+ tabulka nemusí být uspořádaná&lt;br /&gt;
&lt;br /&gt;
- pomalé hledání&lt;br /&gt;
&lt;br /&gt;
'''Binární'''&lt;br /&gt;
&lt;br /&gt;
Jako sekvenční, ale klíče musí být seřazeny, a nad nimi vytvoříme BVS, tedy hledáme vždy v půlce intervalu&lt;br /&gt;
&lt;br /&gt;
+ rychlejší (O(log n))&lt;br /&gt;
&lt;br /&gt;
- nutnost udržovat tabulku seřazenou&lt;br /&gt;
&lt;br /&gt;
'''Fibonacciho'''&lt;br /&gt;
&lt;br /&gt;
Jako binární, ale nerozdělujeme  v polovině, ale podle Fibonacciho posloupnosti (tedy ne 1:1 -&amp;gt; 1:(1:1) -&amp;gt; 1:((1:1): 1) ale (1:1) -&amp;gt; (1:(1:2)) - &amp;gt; (1:((2:3):2))&lt;br /&gt;
&lt;br /&gt;
Prvky vybíráme jako dvojice, první z dvojice je ve Fibonacciho posloupnosti na pozici odpovídající úrovni vnožení stromu (výška větve, ve které hledáme)&lt;br /&gt;
&lt;br /&gt;
Fibonacciho ppst: a1 = 1, a2 = 1, ai = ai-1 + ai - 2 , tedy 1,1,2,3,5,8,13,21,34,55, ....&lt;br /&gt;
&lt;br /&gt;
'''Podle sekundárního klíče'''&lt;br /&gt;
&lt;br /&gt;
Jen pouze pokud sekundární klíč existuje v datech, např seznam jmen, jméno je primární (není, ale pro vysvětlení řekněme, že je) a rok je sekundární. Vyhledáme jména v sekundárním klíči a v nich pak hledáme jméno podle primárního klíče.&lt;br /&gt;
&lt;br /&gt;
Sekundární klíče máme v seznamu, který obsahuje seznam primárních klíčů zabulky pro každý sekundární klíč&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>212.158.144.250</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm</id>
		<title>Rozptylové tabulky s s vnějším řetězením</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm"/>
				<updated>2014-06-13T06:34:44Z</updated>
		
		<summary type="html">&lt;p&gt;212.158.144.250: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HASH&lt;br /&gt;
Pokud máme množinu záznamů, ve které mohou v klíčích existovat duplicity pro různé hodnoty (například tabulka slov podle prvího písmena). Pro tento přístup je nemožné používat přímé adresování, jelikož by docházelo ke kolizím.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Rozptylova-tabulka.jpg]]&lt;br /&gt;
&lt;br /&gt;
Můžeme ale v poli využít prázdná místa a do nich duplicitní hodnoty ukládat. Vyhladávání a ukládání potom obecně nebude v konstantním čase. Můžeme tedy například uložit duplicitní hodnotu do následujícího prázdného místa v tabulce. Problémy jsou však následující:&lt;br /&gt;
&lt;br /&gt;
Můžeme zabrat místo pro klíč, který má na toto místo právoplatný nárok (kolize tedy nastanou nejen pro hodnoty se stejným klíčem, ale i obecně pro libovolný klíč)&lt;br /&gt;
Odsuneme-li i tento klíč, dojde k vytváření shluků (a nabalovíní dalších klíču na tyto shluky, na obr. skluk od písmene A)&lt;br /&gt;
Dochází také k fragmentaci, je tedy nutné hledat až do prvního prázdného klíče, což je při shlukování a vyšší saturaci tabulky pomalé&lt;br /&gt;
 &lt;br /&gt;
       &lt;br /&gt;
Tento přístup tedy použijeme, pokud vímě, že jsou klíče hodnot rovnoměrně rozmístěny, a že hodnot není více než klíčů, a nazývá se vnitřní zřetězení.&lt;br /&gt;
&lt;br /&gt;
Vnější zřetězení znamená, že ke kažnému klíči přiřadíme seznam hodnot. Nedochází tedy ke kolizím, ale vyhledání hodnoty je O(m), kde m je počet hodnot ke každému klíči, tedy nejhůže O(n) (všechny hodnoty jsou v jednom klíči). Tento způsob však zvládá i situace, kde je více hodnot než klíčů&lt;br /&gt;
&lt;br /&gt;
Rozptýlení klíčů.&lt;br /&gt;
&lt;br /&gt;
Pro vnitřní zřetezení lze použít lepší vyhledáváci (a ukládací) funkci, než lineární posun, třeba kvadratickou fci. Kvadratická funkce se může protonout s jinou kv. fcí s jiným počátkem jen jednou) Tím omezíme clustery a kolize, a ukládání a hledání je rychlejší.&lt;br /&gt;
&lt;br /&gt;
Pro vnější zřetezení, nebo pokud je při vnitřním zřetězení mnoho podobných klíčů, je vhodné použít orákulum, rozptylovou (hashovací) funkci. Ta má 2 vlastnosti:&lt;br /&gt;
&lt;br /&gt;
Namapuje hodnoty do rozsahu počtu klíčů&lt;br /&gt;
Ideálně zruší nebo alespoň naruší vztahy mezi podobnými klíči&lt;br /&gt;
&lt;br /&gt;
Příklad: Slovník se vnitřním zřetězením. Slovo převedeme na číslo součtem ASCII hodnot znaků&lt;br /&gt;
&lt;br /&gt;
Vlastnost 1: na toto číslo použijeme operaci modulo. Tato operace je pomalá (jde o dělení), použijeme tedy ideálně velikosti tabulky, které jsou mocninou 2, a po té je dělení pouhým bitovým posunem&lt;br /&gt;
Vlastnost 2: vazby v tomto postupu existují (například anagramy se namapují do stejného pole). Použijeme tedy například následující postup: (( (1. písmeno * (2k+1) ) + 2. písmeno) * (2k+1)) + ... Tím zrušíme vazby mezi podobnými slovy. (2k+1)  použijeme, protože jde o bitový posun a přičtení 1, což je velmi rychlé a 1 přičítáme, protože by poté modulo ztratilo význam.&lt;br /&gt;
&lt;br /&gt;
Pro rovnoměrné rozptýlení prvků v tabulce se rozptylová funkce skládá ze dvou částí. Například když máme rozdělovat do tabulky podle počátečních písmen jmen -&amp;gt; 26 písmen, ale od Q moc jmen není. Modulární rozptylová funkce se vynásobí multiplikativní konstantou. Konstanta ''c'' je z intervalu ''0 ≤ c &amp;lt; 1''. Příkladem takové funkce potom je ''H(m,k)=0,97 * k mod m'', kde ''k'' je klíč a ''m'' velikost pole.&lt;br /&gt;
&lt;br /&gt;
Mohli bychom použít i kryptografické hashování, jako MD5, to je však pro O(1) přístup k seznamům příliš pomalé.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>212.158.144.250</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm</id>
		<title>Rozptylové tabulky s s vnějším řetězením</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm"/>
				<updated>2014-06-13T06:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;212.158.144.250: Přidání informací o rozšířené rozptylovací funkci&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HASH&lt;br /&gt;
Pokud máme množinu záznamů, ve které mohou v klíčích existovat duplicity pro různé hodnoty (například tabulka slov podle prvího písmena). Pro tento přístup je nemožné používat přímé adresování, jelikož by docházelo ke kolizím.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Rozptylova-tabulka.jpg]]&lt;br /&gt;
&lt;br /&gt;
Můžeme ale v poli využít prázdná místa a do nich duplicitní hodnoty ukládat. Vyhladávání a ukládání potom obecně nebude v konstantním čase. Můžeme tedy například uložit duplicitní hodnotu do následujícího prázdného místa v tabulce. Problémy jsou však následující:&lt;br /&gt;
&lt;br /&gt;
Můžeme zabrat místo pro klíč, který má na toto místo právoplatný nárok (kolize tedy nastanou nejen pro hodnoty se stejným klíčem, ale i obecně pro libovolný klíč)&lt;br /&gt;
Odsuneme-li i tento klíč, dojde k vytváření shluků (a nabalovíní dalších klíču na tyto shluky, na obr. skluk od písmene A)&lt;br /&gt;
Dochází také k fragmentaci, je tedy nutné hledat až do prvního prázdného klíče, což je při shlukování a vyšší saturaci tabulky pomalé&lt;br /&gt;
 &lt;br /&gt;
       &lt;br /&gt;
Tento přístup tedy použijeme, pokud vímě, že jsou klíče hodnot rovnoměrně rozmístěny, a že hodnot není více než klíčů, a nazývá se vnitřní zřetězení.&lt;br /&gt;
&lt;br /&gt;
Vnější zřetězení znamená, že ke kažnému klíči přiřadíme seznam hodnot. Nedochází tedy ke kolizím, ale vyhledání hodnoty je O(m), kde m je počet hodnot ke každému klíči, tedy nejhůže O(n) (všechny hodnoty jsou v jednom klíči). Tento způsob však zvládá i situace, kde je více hodnot než klíčů&lt;br /&gt;
&lt;br /&gt;
Rozptýlení klíčů.&lt;br /&gt;
&lt;br /&gt;
Pro vnitřní zřetezení lze použít lepší vyhledáváci (a ukládací) funkci, než lineární posun, třeba kvadratickou fci. Kvadratická funkce se může protonout s jinou kv. fcí s jiným počátkem jen jednou) Tím omezíme clustery a kolize, a ukládání a hledání je rychlejší.&lt;br /&gt;
&lt;br /&gt;
Pro vnější zřetezení, nebo pokud je při vnitřním zřetězení mnoho podobných klíčů, je vhodné použít orákulum, rozptylovou (hashovací) funkci. Ta má 2 vlastnosti:&lt;br /&gt;
&lt;br /&gt;
Namapuje hodnoty do rozsahu počtu klíčů&lt;br /&gt;
Ideálně zruší nebo alespoň naruší vztahy mezi podobnými klíči&lt;br /&gt;
&lt;br /&gt;
Příklad: Slovník se vnitřním zřetězením. Slovo převedeme na číslo součtem ASCII hodnot znaků&lt;br /&gt;
&lt;br /&gt;
Vlastnost 1: na toto číslo použijeme operaci modulo. Tato operace je pomalá (jde o dělení), použijeme tedy ideálně velikosti tabulky, které jsou mocninou 2, a po té je dělení pouhým bitovým posunem&lt;br /&gt;
Vlastnost 2: vazby v tomto postupu existují (například anagramy se namapují do stejného pole). Použijeme tedy například následující postup: (( (1. písmeno * (2k+1) ) + 2. písmeno) * (2k+1)) + ... Tím zrušíme vazby mezi podobnými slovy. (2k+1)  použijeme, protože jde o bitový posun a přičtení 1, což je velmi rychlé a 1 přičítáme, protože by poté modulo ztratilo význam.&lt;br /&gt;
&lt;br /&gt;
Pro rovnoměrné rozptýlení prvků v tabulce se rozptylová funkce skládá ze dvou částí. Například když máme rozdělovat do tabulky podle počátečních písmen jmen -&amp;gt; 26 písmen, ale od Q moc jmen není. Modulární rozptylová funkce se vynásobí multiplikativní konstantou. Konstanta ''c'' je z intervalu ''0 ≤ c &amp;lt; 1''. Příkladem takové funkce potom je ''H(m,k)=0,97 * k mod m'', kde ''k'' je klíč a ''m'' velikost pole.&lt;br /&gt;
&lt;br /&gt;
Mohli bychom použít i kdyptografické hashování, jako MD5, to je však pro O(1) přístup k seznamům příliš pomalé.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>212.158.144.250</name></author>	</entry>

	</feed>