19 package boyermooredemo;
21 import java.awt.Color;
36 public static final Color
BARVA_TYPU =
new Color(46,139,87);
44 public static final Color
BARVA_BILA =
new Color(255,255,255);
47 public static final Color
BARVA_I =
new Color(99, 255, 99);
49 public static final Color
BARVA_J =
new Color(115, 255, 255);
51 public static final Color
BARVA_IJ =
new Color(255, 255, 66);
53 public static final Color
BARVA_MJ =
new Color(255, 165, 165);
55 public static final Color
BARVA_S =
new Color(255, 165, 214);
57 public static final Color
BARVA_T =
new Color(198, 198, 255);
59 public static final Color
BARVA_L =
new Color(255, 222, 214);
61 public static final Color
BARVA_POZ =
new Color(255, 181, 99);
76 public static final int ZM_P = 7;
78 public static final int ZM_N = 8;
80 public static final int ZM_PO = 9;
146 "Návod k použití:\n" +
147 "1. zadejte hledaný řetězec a prohledávaný text\n" +
148 "2. zahajte vizualizaci kliknutím na tlačítko \"Vpřed\"\n" +
149 "3. prohlížejte si vizualizaci klikáním na tlačítka \"Vpřed\" a \"Zpět\"\n" +
150 "4. chcete-li zadat jiný hledaný řetězec, nebo prohledávaný text,\n" +
151 " klikněte na tlačítko \"Reset\" a upravte řetězce dle potřeby",
152 "Nyní si můžete prohlížet vizualizaci algoritmu pomocí tlačítek\n" +
153 "\"Vpřed\" (provede další krok vizualizace) a \"Zpět\" (návrat o 1 krok). \n" +
154 " Chcete-li změnit vyhledávaný řetězec, nebo prohledávaný text, \n" +
155 "klikněte na tlačítko \"Reset\", upravte řetězce dle potřeby a znovu\n" +
156 "spusťte vizualizaci." 164 "private char",
"[] text; ",
"// prohledávaný text\n",
165 "private char",
"[] pat; ",
"// hledaný řetězec\n",
166 "private int ",
"m; ",
"// délka hledaného řetězce\n",
167 "private int ",
"n; ",
"// délka prohledávaného textu\n",
168 "private ",
"TreeMap<Character,Integer> delta1; ",
"// kontejner delta1\n",
169 "private int ",
"delta1Jine; ",
"// delta1 pro znaky, které nejsou v kontejneru\n",
170 "private int",
"[] delta2;\n",
171 "private int",
"[] shoda;\n",
174 "public int",
" BMA(String P, String T) {\n",
175 " // inicializace\n",
176 " m = P.length(); ",
"// délka hledaného řetězce\n",
177 " pat = ",
"new ",
"char",
"[m + ",
"1",
"];\n",
178 " for ",
"(",
"int",
" i = ",
"0",
"; i < m; i++) ",
"// uloží hledaný řetězec do pole pat\n",
179 " pat[i+",
"1",
"] = P.charAt(i);\n",
180 " n = T.length(); ",
"// délka prohledávaného textu\n",
181 " text = ",
"new ",
"char",
"[n + ",
"1",
"];\n",
182 " for ",
"(",
"int ",
"i = ",
"0",
"; i < n; i++) ",
"// uloží prohledávaný řetězec do pole\n",
183 " text[i+",
"1",
"] = T.charAt(i);\n",
185 " vypocetDelta1(); ",
"// výpočet tabulky delta1\n",
186 " vypocetDelta2(); ",
"// výpočet tabulky delta2\n",
188 " int ",
"i = ",
"1",
"; ",
"// pozice v textu\n",
189 " int ",
"j; ",
"// pozice v pat\n",
190 " Integer d1P; ",
"// pomocná delta1\n",
191 " while",
" (i <= (n-m+",
"1",
")) { \n",
193 " while ",
"((j >= ",
"1",
") && (pat[j] == text[i+j-",
"1",
"])) ",
"// dokud do chází ke shodě\n",
194 " j--; ",
"// posun na další znak (testuje od konce)\n",
195 " if ",
"(j == ",
"0",
") ",
"// pokud byl řetězec nalezen\n",
196 " return ",
"i-",
"1",
"; ",
"// řetězec v poli začíná o 1 dál\n",
197 " else ",
"{ ",
"// pokud řetězec nebyl nalezen\n",
198 " d1P = delta1.get(text[i+j-",
"1",
"]);\n",
199 " if ",
"(d1P == ",
"null",
") ",
"// pokud se jedná o znak, který není v kontejneru\n",
200 " d1P = delta1Jine;\n",
201 " i += Math.max(d1P, delta2[j]); ",
"// posun\n",
204 " return ",
"-1",
"; ",
"// řetězec nebyl nalezen\n",
205 "} ",
"// public int BMA()\n",
208 "private void ",
"vypocetDelta1() {\n",
209 " // inicializace kontejneru\n",
210 " delta1 = ",
"new ",
"TreeMap();\n",
211 " // výpočet pole delta1 (pro velký počet možných znaků je zde toto pole\n",
212 " // nahrazeno kontejnerem pro uvedené znaky a proměnnou pro hodnotu\n",
213 " // delta1 neuvedených (jiných) znaků)\n",
214 " for ",
"(",
"int ",
"i = ",
"1",
"; i <= m; i++) { ",
"// výpočet delta1\n",
215 " delta1.put(pat[i],(m-i));\n",
217 " delta1Jine = m;\n",
218 "} ",
"// private void vypocetDelta1()\n",
221 "private void ",
"vypocetDelta2() {\n",
222 " // inicializace polí\n",
223 " delta2 = ",
"new ",
"int",
"[m+",
"1",
"];\n",
224 " shoda = ",
"new ",
"int",
"[m+",
"1",
"];\n",
225 " shoda[m] = ",
"0",
";\n",
226 " delta2[m] = ",
"1",
";\n",
227 " for ",
"(",
"int ",
"j = ",
"0",
"; j <= (m-",
"1",
"); j++) {\n",
228 " shoda[j] = ",
"1",
";\n",
231 " // fáze 1: hledání podřetězců shodných s koncem pat\n",
232 " int ",
"j = ",
"1",
"; ",
"// index, od kterého se pat kontroluje\n",
233 " int ",
"i = m-",
"1",
"; ",
"// počet shodných znaků\n",
234 " while ",
"(i >= j) {\n",
235 " while ",
"((i >= j) && (pat[m-j+",
"1",
"] == pat[i-j+",
"1",
"])) { ",
"// hlední nejdelší shody\n",
237 " shoda[i-j+",
"1",
"] = j;\n",
239 " if ",
"(j > ",
"1",
") ",
"// pokud byla nalezena shoda, provede aktualizaci\n",
240 " delta2[m-j+",
"1",
"] = Math.min(m-i, delta2[m-j+",
"1",
"]);\n",
241 " i = i-j+shoda[m-j+",
"1",
"];\n",
242 " j = Math.max(shoda[m-j+",
"1",
"],",
"1",
");\n",
244 " // fáze 2: výpočet tabulky posunutí\n",
245 " int ",
"t = shoda[",
"0",
"]; ",
"// délka shodného řetězce s koncem pat\n",
246 " int ",
"L = ",
"1",
"; ",
"// aktuální znak pat\n",
247 " int ",
"s; ",
"// maximální posunutí úseku\n",
248 " while ",
"(t > ",
"0",
") {\n",
249 " s = m-t+",
"1",
";\n",
250 " for ",
"(j = L; j <= s; j++) {\n",
251 " delta2[j] = Math.min(delta2[j], s);\n",
256 "} ",
"// private void vypocetDelta2()" 379 false,
true,
true,
false,
false,
false,
380 true,
false,
true,
false,
false,
false,
false,
383 false,
true,
true,
false,
false,
false,
384 true,
false,
true,
false,
false,
false,
false,
390 true,
false,
false,
false,
false,
393 true,
false,
false,
false,
395 true,
false,
false,
false,
false,
false,
false,
397 true,
false,
false,
false,
false,
398 true,
false,
false,
false,
false,
401 true,
false,
false,
false,
false,
406 true,
false,
false,
false,
416 true,
false,
true,
false,
false,
false,
false,
425 false,
true,
true,
false,
false,
false,
426 false,
true,
true,
false,
false,
false,
429 true,
false,
true,
false,
false,
false,
false,
false,
434 true,
false,
false,
false,
false,
435 true,
false,
false,
false,
false,
437 true,
false,
false,
false,
false,
false,
false,
441 true,
false,
false,
false,
false,
442 false,
false,
false,
false,
false,
444 false,
false,
false,
false,
false,
447 true,
false,
false,
false,
false,
448 true,
false,
false,
false,
false,
450 true,
false,
false,
false,
static final int ZADNY_RADEK
static final int POPISEK_L
static final int [] TAB_D2_VR
static final Color BARVA_ZVYRAZNENI_T
static final Color BARVA_L
static final Color BARVA_IJ
static final int [] TAB_D1_VR
static final String TEXTY_POPISKU_MJ
static final Color BARVA_I
static final int BLOK_DELTA1
static final String JINE_ZNAKY
static final int PROM_POZ
static final int POSUN_VPRAVO
static final String TEXTY_POPISKU_IPJ
static final Color BARVA_MJ
static final int [] TAB_SR_VR
static final String [] textyAlgoritmu
static final boolean [] tucneCastiAlgoritmu
static final Color BARVA_CERNA
static final int [][] blokyAlgoritmu
static final String TEXTY_POPISKU_D1P
static final String TEXTY_POPISKU_NM
static final Color BARVA_LITERALU
static final int BLOK_BMA
static final Color BARVA_RIDICICH
static final int [][] radkyAlgoritmu
static final int BLOK_DEKLARACE
static final int POSUN_VLEVO
static final int POPISEK_MJ
static final String [] textyNapovedy
static final int POPISEK_IJ
static final Color BARVA_KOMENTARU
static final Color [] barvyAlgoritmu
static final Color BARVA_S
static final Color BARVA_BILA
static final Color BARVA_J
static final int BLOK_DELTA2
static final Color BARVA_T
static final Color BARVA_ZVYRAZNENI_P
static final Color BARVA_POZ
static final String TEXTY_POPISKU_IMJ
static final Color BARVA_TYPU
static final String TEXTY_POPISKU_L