Implementace slovníku bitovým vektorem Martina Linhartová L06628 Implementace slovníku bitovým vektorem Slovník Slovník je ve své podstatě množina. Množiny jsou pro matematiku i pro informatiku základní strukturou. Algoritmy pracují s množinami pomoci různých operací. Některým algoritmům postačuje vložení prvku, smazání prvku a test přítomnosti v množině. Jiné používají komplikovanější operace. Z toho vyplývá, že nejlepší implementace množiny silně závisí na používaných operacích. Každá množina se skládá z prvků, v našem případě, protože množinou je slovník, jde o slova. Pro nás je důležité, aby prvky v množině byly uspořádané, proto budeme slova ve slovníku řadit abecedně. Implementace slovníku bitovým vektorem Slovník je množina slov, které jsou přímo určeny. Slovník slov reprezentuje pole, Pole patří k nejjednodušším datovým strukturám. Přístup k prvkům pole v našem případě ke slovům je určen udáním hodnoty indexu, jde o strukturu s přímým přístupem. V našem případě se jedná o setříděné pole, v němž je každé pozici přiřazen právě jeden prvek (slovo). V takto setříděném poli se vyhledává pomocí binárního vyhledávání Slovníky se ukládají ve strukturách, které urychlují vyhledávání. Operace, které je možno provádět ve slovníku přidání slova do slovníku - INSERT, vymazání slova ze slovníku DELETE, určení, zda slovo je či není ve slovníku obsaženo MEMBER. Je možné vytvořit i sjednocení - UNION, průnik - INTERSECTION či rozdíl DIFERENCE, tyto operace, jsou však možné jedině při srovnávání dvou slovníku stejného typu, např. od dvou autorů. Operace na slovníku jsou stejné jako na množinách UNION(A, B, C) - do C přiřadí sjednocení A a B, INTERSECTION(A, B, C) - do C přiřadí průnik A a B, DIFFERENCE(A, B, C) - do C přiřadí množinový rozdíl A-B, MEMBER(x, A) - vrátí TRUE, když prvek x patří do množiny, jinak vrátí FALSE, MAKENULL(A) - vytvoří prádnou množinu A, INSERT(x, A) - vloží prvek x do množiny A. DELETE(x, A) - vyhodí prvek x z množiny A, pokud takový v množině existuje, MIN(A), MAX(A) - vrací minimální, resp. maximální prvek množiny A, EQUAL(A, B) - vrátí TRUE, pokud A=B, jinak vrátí FALSE, ASSIGN(A, B) - do A přiřadí hodnotu B.
Pro názornost operací si zvolíme všechna dvoupísmenová slova u prvních pěti písmen v abecedě, to je celkem 25 slov. MAKENULL (A) vytvoří se prázdný slovník A Slouží k vytvoření prázdného slovníku. Po stisknutí tlačítka dojde k vyprázdnění všech tři slovníku. Procedure MujMAKENULL(var A: slovnik); var i: Integer; for i:=1 to 25 do A[i]:=false; procedura TForm1.Button1.Click(Sender:TObject); Memo2.Lines.Clear; MujMakenull(SlA); MujMakenull(SlB); MujMakenull(SlC); INSERT (x, A) vloží slovo x do slovníku A Vloží slova do slovníku A a B. procedure TForm1.Button2Click(Sender: TObject); Memo2.Lines.Clear; SlA[1]:= true; Memo1.Lines.Add('aa'); SlA[2]:= true; Memo1.Lines.Add('ab'); SlA[4]:= true; Memo1.Lines.Add('ad'); SlA[6]:= true; Memo1.Lines.Add('ba'); SlA[7]:= true; Memo1.Lines.Add('bb'); SlA[8]:= true; Memo1.Lines.Add('bc'); SlA[11]:= true; Memo1.Lines.Add('ca'); SlA[13]:= true; Memo1.Lines.Add('cc'); SlA[14]:= true; Memo1.Lines.Add('cd'); SlA[15]:= true; Memo1.Lines.Add('ce'); SlA[17]:= true; Memo1.Lines.Add('db'); SlA[18]:= true; Memo1.Lines.Add('dc'); SlA[20]:= true; Memo1.Lines.Add('de'); SlA[21]:= true; Memo1.Lines.Add('ea'); SlA[24]:= true; Memo1.Lines.Add('ed'); SlA[25]:= true; Memo1.Lines.Add('ee'); SlB[1]:= true; Memo2.Lines.Add('aa'); SlB[3]:= true; Memo2.Lines.Add('ac'); SlB[4]:= true; Memo2.Lines.Add('ad');
SlB[5]:= true; Memo2.Lines.Add('ae'); SlB[7]:= true; Memo2.Lines.Add('bb'); SlB[7]:= true; Memo2.Lines.Add('bc'); SlB[8]:= true; Memo2.Lines.Add('bd'); SlB[9]:= true; Memo2.Lines.Add('bd'); SlB[12]:= true; Memo2.Lines.Add('cb'); SlB[13]:= true; Memo2.Lines.Add('cc'); SlB[15]:= true; Memo2.Lines.Add('ce'); SlB[17]:= true; Memo2.Lines.Add('db'); SlB[19]:= true; Memo2.Lines.Add('dd'); SlB[20]:= true; Memo2.Lines.Add('de'); SlB[21]:= true; Memo2.Lines.Add('ea'); SlB[22]:= true; Memo2.Lines.Add('eb'); SlB[23]:= true; Memo2.Lines.Add('ec'); aa ab ad ba bb bc ca cc cd ce db dc de ea ed ee Slovník B aa ac ad ae bb bc bd cb cc ce db dd de ea eb ec UNION (A, B, C) sjednocení dvou slovníku A a B do slovníku C Slovník C bude obsahovat slova slovníku A a B, které patří buď do slovníku A nebo do slovníku B. Po stlačení tlačítka dojde je sloučení slovníku A a B do slovníku C. Procedure MujUNION(A,B: boolean; var C: boolean); if A or B = true then C:= true; procedure TForm1.Button3Click(Sender: TObject); MujMakenull(SlC); for I:= 0 to 25 do MujUNION(SlA[I], SlB[I], SlC[I]); If MujMEMBER(I, SlC) then Memo3.Lines.Add(hodnota(I)); aa ab ad ba bb bc ca cc cd ce db dc de ea ed ee
Slovník B aa ac ad ae bb bc bd cb cc ce db dd de ea eb ec Slovník C aa ab ac ad ae ba bb bc Bd ca cb cc cd ce db dc dd de ea eb ec ed ee 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 INTERSECTION (A, B, C) - průnik dvou slovníků A a B Slovník C bude obsahovat pouze slova, která se nacházejí jak ve slovníku A tak ve slovníku B Procedure MujINTERSECTION(A,B: boolean; var C: boolean); if A and B = true then C:= true; procedure TForm1.Button4Click(Sender: TObject); MujMakenull (SlC); for I:= 0 to 25 do MujINTERSECTION(SlA[I], SlB[I], SlC[I]); if MujMEMBER(I, SlC) then Memo3.Lines.Add(hodnota (I)); aa ab ad ba bb bc ca Cc cd ce db dc de ea ed ee Slovník B aa ac ad ae bb bc bd cb cc ce db dd de ea eb ec Slovník C aa ad bb bc cc ce db de ea 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 DIFERENCE (A, B, C) - slovník C bude obsahovat rozdíl slovníku A a B Slovník C bude obsahovat pouze slova slovníku A, které se nenacházejí ve slovníku B Procedure MujDIFFERENCE(A,B: boolean; var C: boolean);
if (A = true) and (B = false) then C:= true; procedure TForm1.Button5Click(Sender: TObject); MujMakenull(SlC); for I:= 0 to 25 do MujDIFERENCE(SlA[I], SlB[I], SlC[I]); if MujMEMBER(I,SlC) then Memo3.Lines.Add(hodnota (I)); aa ab ad ba bb Bc ca cc cd ce db dc de ea ed ee Slovník B aa ac ad ae bb Bc bd cb cc ce db dd de ea eb ec Slovník C ab ba ca cd dc ed ee 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 MEMBER (x, A) vrátí TRUE, když slovo x patří do slovníku, jinak vrátí FALSE Určuje, zda je či není slovo obsaženo ve slovníku A. Function MujMEMBER( x: integer; A: slovnik) :boolean; result:=false; If A[x] then result:=true; procedure TForm1.Button6Click(Sender: TObject); if MujMEMBER(pozice(edit1.Text),SlA) then Memo1.Lines.Add('Patří do slovníku A') else Memo1.Lines.Add('Nepatří do slovníku A') ASSIGN(A,B) Přiřadí slova ze slovníku B do slovníku A Procedure MujASSIGN(var A,B: slovnik); var j: Integer;
for j:= 1 to 25 do A[j]:= B[j]; procedure TForm1.Button8Click(Sender: TObject); MujASSIGN(SlA, SlB); for I:= 1 to 25 do if MujMEMBER(I,SlA) then Memo1.Lines.Add(hodnota (I)); Použitá literatura Ďuráková, D., Dvorský, J., Ochodková, E. Základy algoritmizace. Ostrava: VŠB - Technická univerzita Ostrava, 2003