Saturday, June 25, 2011

SW: Adresne vyhladavanie

mozme rozdelit na

  • indexovanie klucom 
    • priamy pristup, pretoze kluc je priamo adresou 
    • rozsah klucov zodpoveda priamo rozsahu indexov 
    • asymptoticka zlozitost je theta(1)
  • rozptylovanie
    • funguje vypoctom adresy z hodnoty kluca 
    • priemerna zlozitost je omega(1)
  • porovnanie klucov 
    • toto je asociativne vyhladavanie 
    • patri sem napriklad sekvencne vyhladavanie, BVS, 
    • zlozitost omega(log(n))
ak mame vela pamate => index. klucom 
ak mame vela casu => sekvencne vyhladavanie 
ak nemame ani jedno => rozptylovanie 

Hashing 
- vhodne pre vyhladavanie, ale nevhodne pre triedenie 

- adresuje na zaklade rozptylovacej funkcie h(k)
- zobrazujem mnozinu klucov K z univerza do itnervalu adries <Amin, Amax>
- rozptylovacia funkcia by mala byt jednoducha a rychla a je silne zavisla na vlastnostiach klucov a ich reprezentacii v pamati
- mala by generovat minimum kolizii a rovnomerne vyuzivat adresny priestor
- ak dojde ku kolizi => bud je zla fcia, pretoze vracia prilis blizke hodnoty, alebo spatne pocita, ak to nie je pripad, tak musime kolizie riesit
- kolizie spomaluju aplikaciu
- sposoby riesenia su zretazene rozptylovanie a otevrene rozptylovanie

zretazene rozptylovanie
- mame prvu h(k), napr. h(k) = k mod 3 (takze 3 je potom rozsah adries pre umiestnenie prvkov)
- ak dojde ku kolizii, teda mame synonymum, tak potom prvok zretazim do spojoveho zoznamu za prvok, s ktorym kolidujem
- toto retazenie nazyvam retazou synonym a ma idealne dlzku alfa = n/m, kde alfa > 1, n je pocet prvkov a m velkost tabulky < m
- vkladanie = O(1)
- vyberanie, mazanie = O(n) ak to ide fakt zle, alebo O(1+alfa) priemerne
- vyplati sa, pretoze sa neplytva pamatou

otvorene rozptylovanie
- pocet prvkov je vopred znamy
- tu sa nebudu pouzivat ukazatele, ale bude sa ukladat do pola
- su dve moznosti ako ukladat prvky, ked dojde ku kolizii - Linear Probing a Double Hashing
- Linear Probing v pripade kolizie ulozi prvok na dalsie miesto v poradi, ktore je volne, vytvara tak zhluky, ktore mozu byt az prilis dlhe
- Double hashing pri kolizii pouzije druhu hashovaciu funkciu a ked nevyjde ani to, tak pouzije linear probing,
funkcia moze vyzerat takto: h(k) = (k mod 5 + i*h2(k)) mod 5, h2(k) = (k + 3i)mod5 ak to nevyjde na 1x , tak vloz o 3 pozice dalej (v pripade prveho neuspechu)

problemom je, ako zaplnit tabulku
- tabulka moze byt viac zaplenena, kym zacne klesat vykonnost a operacie trvaju umerne zaplnenosti tabulky, vhodne je tak 3/4, 9/10