Saturday, June 25, 2011

SW: Asociativne vyhladavanie

Asociativne vyhladavanie 
- bud je implementovane v poli - vyhladavanie pulenim, sekvencne vyhladavanie 
- alebo je implementovane v binarnom vyhladavacom strome 

Sekvencne vyhladavanie - vyhladavanie v poli, prechadzanie polom prvok za prvkom a jedneho dna narazim na ten spravny prvok .. 
   - moze byt v 

nezoradenom poli - v kazdom kroku sa pytame, ci sme nasli ten spravny prvok, ak ano, tak vyborne :)
                            - zlozitost je O(n) pre vsetko, okrem vlozenia
                            - vlozenie je O(1), pretoze tam ten prvok proste len niekam jebnem a nic ine ma nezaujima

nezoradenom poli so zarazkou - na koniec pola si dame hladany prvok/zarazku, cim zamedzime, aby sme prekrocili hranice pola a hladany prvok vzdy najdeme. Takto usetrime test na koniec pola, ale zlozitost bude stale rovnaka 

vyhladavanie pulenim - jedna sa o binarne vyhladavanie, ktore vyuziva metodu rozpolovania intervalu. V takomto poli uz mame zoradene prvky. Vyhladavanie zahajime v polovicke pola a postupujeme vpravo/vlavo, podla toho, ako je pole zoradene. Postup vpravo/vlavo znamena rozdelenie zostavjucej casti pola na dve casti a znova - top-down approach command and conquer. Vyhladavanie takto limitujeme na O(log(n)) a minimum a maximum dokazeme urcit okamzite O(1)

dalsou moznostou asociativneho vyhladavania je Binary Search Tree
- usporiadany, korenovy, binarny strom
- lavy uzol je vzdy mensi ako koren, pravy je vacsi => vsetko vlavo je mensie ako koren a vsetko vpravo je vacise ako koren (alebo uzol, z ktoreho vetvime)
- pamatove zlozitost je O(n), vsetky ostatne su O(h) a h = log(n) u vyvazeneho stromu, n u nudle
- BVS preto vyvazujeme - idealny pripad je, ak pocet uzlov laveho podstromu je rovny poctu uzlov praveho podstromu - toto je prilis silnou podmienkou a preto uvazujeme slabsie podmienky. Vyvazuje sa podla 
vysky - AVL strom
vysky a poctu potomkov - 1-2 stromy 
vahy podstromu - vahovo vyvazene stromy 

pri vyvazovani stromu vlastne rotujeme prvky => leva a prava rotace a levo-prave/pravo-lave rotacie 

AVL strom 
- vyskovo vyvazeny strom 
- prazdny strom = -1 
- neprazdny = 1 + vyska dlhsieho potomka 
- k vyvazovaniu rotaciou pristupujeme az ked je nahodou uzol mimo <-1,1>


vahovo vyvazene stromy 
- oznacene ako stromy s ohranicenym vyvazenim 
- list - vaha 1/2 
- inak w = (|Ul| + 1) / (|U| + 1), kde Ul je pocet uzlov vlavo a U je pocet uzlov podstromu (vcitane u)

- musime nejako urcit hranicu, ako ma byt strom vyvazeny  a to je alfa <= w(u) <= 1-alfa a alfa sa zvacsa urcije ako 0 <= alfa <= 1/2. toto sa vola ohranicene vyvazovanie a strom je stromom s ohranicenym vyvazovanim 

dalsim pripadom BVS je cerveno-cierny strom 
- uzel je cerveny alebo cierny 
- kazdy list je cierny 
- ak je uzol cerveny, tak jeho potomkovia su cierny 
- kazda jednoducha cesta z u do listu obsahuje rovnaky pocet ciernych uzlov 
- koren je cierny 
=> cierna vyska stromu, a to je pocet ciernych uzlov na ceste z u ->  v (u sa nepocita, alebo je 0)