Semestrální práce 2 – znakový strom Ondřej Petržilka
Datový model
BlockFileRecord Bázová abstraktní třída pro záznam ukládaný do blokového souboru RhymeRecord Konkrétní třída záznamu ukládaného do blokového souboru. Obsahuje tři řetězce, slovo v českém jazyce, anglickém jazyce a německém jazyce.
BlockFileLocation Třída reprezentující pozici záznamu v blokovém soubory, pomocí objektu této třídy lze v blokovém souboru jednoznačně identifikovat záznam.
Database
Třída reprezentující databázi záznamů, template parametr T musí být odvozen od třídy BlockFileRecord. T je typ (třída) záznamu. Database obsahuje indexovou strukturu která je příponový znakový strom, template parametr znakového stromu je BlockFileLocation, znakový strom tedy ukládá ke každému klíči záznam typu BlockFileLocation, pomocí tohoto záznamu lze najít v blokovém souboru data. Database dále obsahuje blokový soubor který slouží jako úložiště záznamů, template parametr blokového souboru je stejný jako template parametr T třídy Database. Při vytvoření databáze jsou v kontruktoru předány parametry definující název souboru s indexem, název blokového souboru s daty, velikost jednoho záznamu a počet záznamů v bloku. Database obsahuje metody pro přidání záznamu s klíčem, odebrání záznamu podle klíče, vyhledání záznamu a další popůrné metody. Pokud aplikace potřebuje vyhledat záznam tak aby měla přístup k celému podstromu, může využít proměnnou index. PostfixTrie Reprezentuje příponový znakový strom, template parametr T je typ který je uložen u každého záznamu ve znakovém stromu. V rámci této aplikace se využívá PostfixTrie. PostfixTrie obsahuje metody pro vložení záznamu s klíčem, odstranění záznamu podle klíče, vyhledání uzlu podle klíče a vyhledání dat uzlu podle klíče. PostfixTrieNode Představuje uzel příponového znakového stromu, template parametr T je typ který může být uložen u každého uzlu. Uzel stromu obsahuje lineární seznam potomků, odkaz na rodiče, znak který tento uzel reprezentuje a data typu T, pokud jsou data rovna null, tento uzel neobsahuje záznam, avšak jeho potomci stále mohou obsahovat platné záznamy. Obsahuje metody pro smazání potomka, vložení potomka a vyhledání potomka podle znaku. Metoda pro vložení potomka vloží nového potomka bez dat a vrátí ho, to umožnuje použít tuto metodu opakovaně pro vytvoření podstromu. BlockFile Reprezentuje blokový soubor. Při vytváření instance se třeba předat konstruktoru název blokového souboru, velikost záznamu a počet záznamů v bloku. V tomto dokumentu je za volný blok považován blok který obsahuje alespoň jeden prázdný záznam. Soubor obsahuje hlavičku které má 4B, což je počet bloků v souboru. Dále obsahuje jednotlivé bloky a nakonec obsahuje počet volných bloků a seznam volných bloků. Seznam volných bloků (bloky které obsahují alespoň jeden volný záznam) je nakonci protože může být různě veliký. Obsahuje metody pro vložení záznamu, smazání záznamu, aktualizaci záznamu a vyhledání záznamu. Dále obsahuje další podpůrné metody. Záznamy jsou jednoznačně identifikovány pomocí objektu třídy BlockFileLocation, který obsahuje číslo bloku a číslo záznamu.
Blokový soubor načítá aktuální blok až při požadavku na záznam z tohoto bloku a aktuální blok uchovává v paměti dokud není potřeba upravit jiný blok. Pokud je třeba upravit jiný blok (přidat, změnit či smazat záznam) aktuální blok je uložen a nový blok načte. Toto chování snižuje počet blokových přenosů pokud se pracuje s více záznamy v témže bloku. BlockFile obsahuje seřazená čísla bloků, které obsahují alespoň jeden volný záznam, při vložení nového záznamu se vloží záznam na první volné místo v prvním bloku s volným místem. BlockFileBlock Reprezentuje Blok v blokovém souboru, obsahuje metody pro vložení, smazání, vyhledání a aktualizaci záznamu. Dále obsahuje metody pro načtení a uložení bloku. BlockFile při většině operací zajistí aby byl v paměti načten správný blok a pak předá řízení objektu třídy BlockFileBlock aby provedla úpravu záznamu. Každý blok obsahuje hlavičku, v hlavičce je číslo prvního volného záznamu a bitové pole reprezentující platnost jednotlivých záznamů. Poté už blok obsahuje pouze jednotlivé záznamy. Pro jednoduchost je každý bit v bitovém poli je uložen do jednoho bajtu aby se nemuselo řešit zarovnávání na celé bajty.
Struktura blokového souboru Struktura z pohledu souboru Velikost bloku je pro tuto aplikaci 764 Bajtů, velikost bloku lze upravit změnou počtu záznamů v bloku nebo změnou velikosti záznamu. Počet bloků
4B
Blok
764B
Blok
764B
4B
Počet bloků x 764B
...
Počet volných bloků Číslo 1. volného bloku Číslo 2. volného bloku ...
4B 4B 4B
4B + Počet volných bloků x 4B
Struktura z pohledu bloku Velikost záznamu je 75B, obsahuje české slovo o velikost 25B, anglický překlad o velikosti 25B a německý překlad o velikost 25B. Počet záznamů v bloku je 10. Tomu odpovídá velikost bloku 764B. Pokud bude počet záznamů v bloku nebo velikost záznamu jiná velikost bloku v bajtech se vypočte takto: 4 + počet záznamů v bloku * (velikost záznamu + 1)
První volný záznam Platnost 1. záznamu Platnost 2. záznamu Platnost 3. záznamu ...
Záznam
4B 1B 1B 1B
14B
75B 764B
Záznam
...
75B
750B
Ovládání aplikace
Při spuštění aplikace se defaultně zobrazí výpis souborů aby bylo na první pohled jasné co všechno se nachází v databázi (a zda databáze obsahuje nějaká data). Pro práci v normální režimu stačí v menu View odškrtnout položku Debug. Aplikace umožňuje vkládání záznamů, mazání záznamů a hledání. Pro vložení záznamu stačí vyplnit skupinu vstupních polí „Vkládání“ a kliknout na tlačítko vložit. Pro odstranění je třeba vyplnit vstupní pole ve skupině „Mazání“ a kliknout na tlačítko Odstranit. Pro hledání je třeba vložit slovo a počet znaků podle kterých se má hledat shoda a kliknout na tlačítko vyhledat. Výsledky se zobrazí v pravé části formuláře. Pokud je pole výsledků plné a chcete zobrazit další výsledky stačí do něj kliknout a pomocí kláves PageUp a PageDown procházet výsledky. Režim debug slouží především pro kontrolu dat v databázi, slova jsou zobrazena v levé části formuláře ve stromové struktuře, tři vstupní pole Cz, En a De NEOBSAHUJÍ aktuální stav databáze, jsou předvyplněna texty složícími pro naplnění prázdné databáze, to lze provést tlačítkem Parse text, tlačítkem Clear all lze obsah databáze smazat. Dále lze odstranit záznam vyplněním slova do pole a kliknutím na tlačítko Odstranit. V pravé části obrazovky je zobrazeno prvních 30 bloků (po roztažení formuláře na šířku), každý box reprezentuje jeden záznam, najetím na box se vypíše v dolní části obrazovky co je v záznamu uloženo. Nad box je seznam bloků s prázdným záznamem. Prázdný záznam je označen písmenem e a šedou barvou, obsazený záznam je označen zelenou barvou.