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 parametera
vedeli 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
remove
a upravte metóduadd
tak , 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
poz
ai
?
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
n
po 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
n
po 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.