Cvičenie 11 – Hash
Ciele cvičení:
- rozumieť priemernej a agregovanej zložitosti
 - rozumieť základným princípom hashovania
 - vedieť, ako možno hashovanie využiť pri ukladaní dát a následnej práci s nimi
 - vedieť, ako možno hashovanie využiť pri stringologickom Karp-Rabin-ovom algoritme
 
Budovanie HashSet-u
Pomocou poľa LinkedList-ov implementujte triedu, ktorá realizuje HashSet reťazcov s nemenným počtom priehradok. Poznámka: Použite hash-ovaciu funkciu z prednášky.
Pred implementáciu rozdiskutujte:
- aké konštruktory je potrebné vytvoriť,
 - ako implementovať hash-ovaciu funkciu tak, aby sme nemali redundantný kód a vedeli ju neskôr jednoducho modifikovať.
 
Trieda nech obsahuje metódy:
- Zistite, či vaša implementácia naozaj reprezentuje množinu alebo vieme pridať rovnaký reťazec dvakrát.
 - Zmeňte použitú hash-ovaciu funkciu aby bola založená na lineárnej kongruencii s parametrom 
a. Upravte implementáciu aby sme parameteravedeli zadať v konštruktore. - Rozdiskutujte vlastnosti hash-ovacej funkcie pre prípad, že veľkosť poľa je násobkom parametra 
a. - Pridajte metódu 
removea upravte metóduaddtak , aby Load Factor bol vždy medzi hodnotami 0,25 a 0,75. Poznámka: Táto implementácia nebude mať pevný počet priehradok. 
Hľadanie výskytu intuitívne
Implementujte naivný algoritmus na nájdenie všetkých výskytov vzorky v reťazci. Využitie pritom schému:
- Je pravdou, že každý „zaujímavý“ okamih výpočtu možno charakterizovať obsahom premenných 
pozai? 
Algoritmus Karp-Rabin
- Implementujte algoritmus Karp-Rabin z prednášky.
 - Rozdiskutujte zmeny v algoritme ak by sme uvažovali aj s použitím iných znakov ako malé a veľké písmena anglickej abecedy.
 - Rozdiskutujte pre aký najdlhší hľadaný reťazec s uvedeným hash-ovanim algoritmus funguje a prečo?
 
Pole s kapacitou a HashSet dôkazy
- Dokážte, že amortizovaná zložitosť ľubovoľných 
npo sebe vykonaných operácii pridania a odobrania z koncu poľa s kapacitou budeO(n). - Dokážte, že amortizovaná zložitosť ľubovoľných 
npo sebe vykonaných operácii pridania a odobrania z vašej implementácie HashSet-u budeO(n). - Využite poznatky z predchádzajúcich dvoch bodov na návrh vylepšenej implementácie zásobníka a radu z tretieho cvičenia a popíšte zložitosť operácii (vkladania a vyberania) v rôznych prípadoch.
- Toto riešenie sa vám môže zísť na štátniciach.
 
 
