Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018 doc. Mgr. Jiří Dvorský, Ph.D. 24. dubna 2018 Verze zadání 24. dubna 2018 První verze 1
1 Hašovací tabulka V tomto zadání bude vaším ukolem implementovat hašovací tabulku s následujícími vlastnostmi: tabulka bude implementována jako třída HashTable v C++, tabulka bude ukládat prvky typu string, velikost tabulky bude pevně daná v konstruktoru, kolize vkládaných prvků budou řešeny pomocí separátního řetězení, což znamená, každý slot tabulky obsahuje seznam a v něm jsou uloženy kolidující prvky, tj. prvky tabulky se stejnou hašovací hodnotou, a pro výpočet hašovací hodnoty můžete využít buď hašovací funkci z C++ Standard Library, viz například http://en.cppreference.com/w/cpp/string/basic_string/hash, nebo některou z hašovacích funkcí popsaných na Wikipedii, viz https://en.wikipedia.org/ wiki/list_of_hash_functions#cite_note-2, část Non-cryptographic hash functions. Třída HashTable bude implementovat: konstruktor bez parametrů, velikost tabulky bude nastavena na předem danou, vámi zvolenou, hodnotu, konstruktor s jedním parametrem size typu int, kde parametr Size udává velikost tabulky, metodu Insert s jedním parametrem s typu string, která vloží řetězec s do tabulky, metoda nevrací žádnou hodnotu, metodu Search s jedním parametrem s typu string a vracející true pokud se řetězec s nachází v tabulce, jinak vracející false, metodu Count vracející číslo typu int odpovídající počtu prvků uložených v tabulce, metodu LoadFactor vracející číslo typu double odpovídající faktoru naplnění tabulky, a metodu Report, která, vhodným způsobem, vypíše tabulku na standardní výstup. 2
2 Testování hašovacích funkcí Vaším úkolem je experimentálně prozkoumat chování hašovací funkce Java hashcode(), viz https://en.wikipedia.org/wiki/java_hashcode() či https://docs.oracle.com/javase/ 1.5.0/docs/api/java/lang/String.html#hashCode%28%29, pro danou množinu textových řetězců a různé rozsahy hašovacích hodnot. Experiment proběhne následujícím způsobem: 1. Implementujete zadanou hašovací funkci, nazvěme ji pro jednoduchost h. 2. Zvolíte rozsah hašovacích hodnot N. Hašovací funkce h bude tedy pro řetězec s vracet hodnoty h(s) v rozsahu 0 h(s) < N. Pokud funkce h vrací hodnoty v jiném rozsahu je nutné tyto hodnoty upravit, nejjednodnodušeji pomocí operace modn. 3. Postupně načtete všechny řetězce z připraveného textového souboru, každý řádek v tomto souboru představuje jeden řetězec, vypočtete pro ně hašovací hodnotu a budete sledovat četnosti, s jakou se jednotlivé hašovací hodnoty vyskytly. 4. Na závěr naměřené četnosti vypíšete do tabulky, případně zobrazíte v grafu. (Excel?) 5. Experiment zopakujete pro různé hodnoty N. Textový soubor pro experimenty bude k dispozici na stránkách předmětu. 3
3 Hašovací tabulka V tomto zadání bude vaším ukolem implementovat hašovací tabulku s následujícími vlastnostmi: tabulka bude implementována jako třída HashTable v C++, tabulka bude ukládat prvky typu string, velikost tabulky bude pevně daná v konstruktoru, kolize vkládaných prvků budou řešeny pomocí otevřeného adresování, metodou kvadratických pokusů, a pro výpočet hašovací hodnoty můžete využít buď hašovací funkci z C++ Standard Library, viz například http://en.cppreference.com/w/cpp/string/basic_string/hash, nebo některou z hašovacích funkcí popsaných na Wikipedii, viz https://en.wikipedia.org/ wiki/list_of_hash_functions#cite_note-2, část Non-cryptographic hash functions. Třída HashTable bude implementovat: konstruktor bez parametrů, velikost tabulky bude nastavena na předem danou, vámi zvolenou, hodnotu, konstruktor s jedním parametrem size typu int, kde parametr Size udává velikost tabulky, metodu Insert s jedním parametrem s typu string, která vloží řetězec s do tabulky, metoda bude vracet true, pokud se vložení do tabulky zdařilo, jinak bude vracet false, metodu Search s jedním parametrem s typu string a vracející true pokud se řetězec s nachází v tabulce, jinak vracející false, metodu Count vracející číslo typu int odpovídající počtu prvků uložených v tabulce, metodu LoadFactor vracející číslo typu double odpovídající faktoru naplnění tabulky, a metodu Report, která, vhodným způsobem, vypíše tabulku na standardní výstup. 4
4 Testování hašovacích funkcí Vaším úkolem je experimentálně prozkoumat chování hašovací funkce PJW hash function, viz https://en.wikipedia.org/wiki/pjw_hash_function, použijte variantu UNIX ELF, pro danou množinu textových řetězců a různé rozsahy hašovacích hodnot. Experiment proběhne následujícím způsobem: 1. Implementujete zadanou hašovací funkci, nazvěme ji pro jednoduchost h. 2. Zvolíte rozsah hašovacích hodnot N. Hašovací funkce h bude tedy pro řetězec s vracet hodnoty h(s) v rozsahu 0 h(s) < N. Pokud funkce h vrací hodnoty v jiném rozsahu je nutné tyto hodnoty upravit, nejjednodnodušeji pomocí operace modn. 3. Postupně načtete všechny řetězce z připraveného textového souboru, každý řádek v tomto souboru představuje jeden řetězec, vypočtete pro ně hašovací hodnotu a budete sledovat četnosti, s jakou se jednotlivé hašovací hodnoty vyskytly. 4. Na závěr naměřené četnosti vypíšete do tabulky, případně zobrazíte v grafu. (Excel?) 5. Experiment zopakujete pro různé hodnoty N. Textový soubor pro experimenty bude k dispozici na stránkách předmětu. 5
5 Hašovací tabulka V tomto zadání bude vaším ukolem implementovat hašovací tabulku s následujícími vlastnostmi: tabulka bude implementována jako třída HashTable v C++, tabulka bude ukládat prvky typu string, velikost tabulky bude pevně daná v konstruktoru, kolize vkládaných prvků budou řešeny pomocí otevřeného adresování, metodou dvojitého hašování, a pro výpočet hašovací hodnoty můžete využít buď hašovací funkci z C++ Standard Library, viz například http://en.cppreference.com/w/cpp/string/basic_string/hash, nebo některou z hašovacích funkcí popsaných na Wikipedii, viz https://en.wikipedia.org/ wiki/list_of_hash_functions#cite_note-2, část Non-cryptographic hash functions. Třída HashTable bude implementovat: konstruktor bez parametrů, velikost tabulky bude nastavena na předem danou, vámi zvolenou, hodnotu, konstruktor s jedním parametrem size typu int, kde parametr Size udává velikost tabulky, metodu Insert s jedním parametrem s typu string, která vloží řetězec s do tabulky, metoda bude vracet true, pokud se vložení do tabulky zdařilo, jinak bude vracet false, metodu Search s jedním parametrem s typu string a vracející true pokud se řetězec s nachází v tabulce, jinak vracející false, metodu Count vracející číslo typu int odpovídající počtu prvků uložených v tabulce, metodu LoadFactor vracející číslo typu double odpovídající faktoru naplnění tabulky, a metodu Report, která, vhodným způsobem, vypíše tabulku na standardní výstup. 6
6 Testování hašovacích funkcí Vaším úkolem je experimentálně prozkoumat chování hašovací funkce Jenkins hash function, viz https://en.wikipedia.org/wiki/jenkins_hash_function, pro danou množinu textových řetězců a různé rozsahy hašovacích hodnot. Experiment proběhne následujícím způsobem: 1. Implementujete zadanou hašovací funkci, nazvěme ji pro jednoduchost h. 2. Zvolíte rozsah hašovacích hodnot N. Hašovací funkce h bude tedy pro řetězec s vracet hodnoty h(s) v rozsahu 0 h(s) < N. Pokud funkce h vrací hodnoty v jiném rozsahu je nutné tyto hodnoty upravit, nejjednodnodušeji pomocí operace modn. 3. Postupně načtete všechny řetězce z připraveného textového souboru, každý řádek v tomto souboru představuje jeden řetězec, vypočtete pro ně hašovací hodnotu a budete sledovat četnosti, s jakou se jednotlivé hašovací hodnoty vyskytly. 4. Na závěr naměřené četnosti vypíšete do tabulky, případně zobrazíte v grafu. (Excel?) 5. Experiment zopakujete pro různé hodnoty N. Textový soubor pro experimenty bude k dispozici na stránkách předmětu. 7
7 Hašovací tabulka V tomto zadání bude vaším ukolem implementovat hašovací tabulku s následujícími vlastnostmi: tabulka bude implementována jako třída HashTable v C++, tabulka bude ukládat prvky typu string, velikost tabulky bude pevně daná v konstruktoru, kolize vkládaných prvků budou řešeny pomocí otevřeného adresování, metodou lineárních pokusů, a pro výpočet hašovací hodnoty můžete využít buď hašovací funkci z C++ Standard Library, viz například http://en.cppreference.com/w/cpp/string/basic_string/hash, nebo některou z hašovacích funkcí popsaných na Wikipedii, viz https://en.wikipedia.org/ wiki/list_of_hash_functions#cite_note-2, část Non-cryptographic hash functions. Třída HashTable bude implementovat: konstruktor bez parametrů, velikost tabulky bude nastavena na předem danou, vámi zvolenou, hodnotu, konstruktor s jedním parametrem size typu int, kde parametr Size udává velikost tabulky, metodu Insert s jedním parametrem s typu string, která vloží řetězec s do tabulky, metoda bude vracet true, pokud se vložení do tabulky zdařilo, jinak bude vracet false, metodu Search s jedním parametrem s typu string a vracející true pokud se řetězec s nachází v tabulce, jinak vracející false, metodu Count vracející číslo typu int odpovídající počtu prvků uložených v tabulce, metodu LoadFactor vracející číslo typu double odpovídající faktoru naplnění tabulky, a metodu Report, která, vhodným způsobem, vypíše tabulku na standardní výstup. 8