Applet pro demonstraci Boyerova-Mooreova algoritmu  1.0
Algoritmus.java
Zobrazit dokumentaci tohoto souboru.
1 /******************************************************************************
2  * Název projektu: Aplet pro demonstraci Boyerova-Mooreova algoritmu
3  * Balíček: boyermooredemo
4  * Soubor: Algoritmus.java
5  * Datum: 15.4.2008
6  * Poslední změna: 18.4.2008
7  * Autor: Jaroslav Dytrych xdytry00
8  *
9  * Popis: Třída, kteá provádí vyhledávání řetězce v textu pomocí
10  * Boyerova-Mooreova algoritmu a ukládá informace do seznamu změn
11  * uživatelského rozhraní, které budou následně využity při vizualizaci.
12  * Jako počítadlo kroků využívá proměnnou pro počet kroků z appletu,
13  * čímž zajistí správnou hodnotu této proměnné po dokončení operace při
14  * ukončení v libovolném bodě.
15  * Aby se nevytvářely zbytečné instance konstant, využívá instanci
16  * třídy konstant, kterou vlastní applet.
17  *
18  ******************************************************************************/
19 
20 /**
21  * @file Algoritmus.java
22  *
23  * @brief Třída Algoritmus - vyhledávání v řetězci a tvorba seznamu změn GUI
24  */
25 
26 package boyermooredemo;
27 
28 import java.util.Iterator;
29 import java.util.TreeMap;
30 
31 /**
32  * Třída, kteá provádí vyhledávání řetězce v textu pomocí Boyerova-Mooreova
33  * algoritmu a ukládá informace do seznamu změn uživatelského rozhraní,
34  * které budou následně využity při vizualizaci.
35  * Jako počítadlo kroků využívá proměnnou pro počet kroků z appletu, čímž
36  * zajistí správnou hodnotu této proměnné po dokončení operace při ukončení
37  * v libovolném bodě.
38  * Aby se nevytvářely zbytečné instance konstant, využívá instanci třídy
39  * konstant, kterou vlastní applet.
40  *
41  * @brief Vyhledávání v řetězci a tvorba seznamu změn GUI
42  */
43 public class Algoritmus {
44  /**
45  * Reference na applet pro demonstraci algoritmu
46  */
48 
49  /** prohledávaný text */
50  private char[] text;
51  /** hledaný řetězec */
52  private char[] pat;
53  /** délka hledaného řetězce */
54  private int m;
55  /** délka prohledávaného textu */
56  private int n;
57  /** kontejner delta1 */
58  private TreeMap<Character,Integer> delta1;
59  /** delta1 pro znaky, které nejsou v kontejneru */
60  private int delta1Jine;
61  /** pole delta2 */
62  private int[] delta2;
63  /** pole shoda */
64  private int[] shoda;
65 
66  /** pomocný kontejner pro vizualizaci - uchovává souřadnice v tabulce */
67  private TreeMap<Character,Integer> poziceVDelta1;
68  /** pomocná proměnná pro vizualizaci - počet položek v tabulce delta1 */
69  private int pocetVDelta1;
70 
71 
72  /**
73  * Konstruktor třídy
74  *
75  * @param apABMD Reference na applet pro demonstraci algoritmu
76  */
78  {
79  ABMD = apABMD; // uloží referenci na applet
80  }
81 
82  /**
83  * Metoda pro vyhledávání řetězce v textu a tvorbu seznamu změn uživatelského
84  * rozhraní pro vizualizaci. Nastavuje také počet kroků vizualizace ve třídě
85  * appletu.
86  *
87  * @param P Vyhledávaný řetězec
88  * @param T Prohledávaný text
89  * @return Vrací pozici vyhledávaného řetězce v prohledávaném textu, nebo -1,
90  * pokud se řetězec v textu nevyskytuje.
91  */
92  public int BMA(String P, String T)
93  {
94  Integer pomI; // pomocná proměnná pro zobrazení
95  Character pomC; // pomocná proměnná pro zobrazení
96  int vypsano = 0; // pomocná proměnná pro zobrazení - počet vypsaných znaků textu
97  int posun = 0; // pomocná proměnná pro zobrazení - posunutí v tabulce R
98  int pomPosun = 0; // pomocná proměnná pro zobrazení
99  int pom; // pomocná proměnná pro zobrazení
100  int zvyrazneno = 0; // pomocná proměnná pro zobrazení - počet zvýrazněných
101  // sloupců v tabulce SR
102  int presah; // velikost tabulky SR je 3 * m + presah, přičemž 3*m je nezbytný
103  // manipulační prostor a presah je pro větší přehlednost
104  int pomITD1 = 1; // pomocný index do tabulky delta1 pro vizualizaci
105 
106 
107  m = P.length(); // délka hledaného řetězce
108 
109  // výpočet přesahu nutné velikosti tabulky SR
110  if ((3*m+5) > ABMD.kon.TAB_SR_VR[1])
111  { // pokud je výchozí velikost tabulky malá (přesah 5 znaků by se nevešel)
112  presah = 5; // přesah bude 5 znaků
113  }
114  else
115  { // pokud je výchozí velikost tabulky dostatečná, jako přesah se využije
116  // celá zbývající část tabulky
117  presah = ABMD.kon.TAB_SR_VR[1] - 3*m;
118  }
119 
120  ABMD.pocetKroku++; // vytvoření kroku vizualizace
121  // uloží informace o změně zobrazení - proměnná m, posun v algoritmu
122  pomI = Integer.valueOf(m);
123  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
124  ABMD.kon.PROM_M,pomI.toString()));
125  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,11));
126 
127 
128  pat = new char[m + 1];
129  ABMD.pocetKroku++; // vytvoření kroku vizualizace
130  // uloží informace o změně zobrazení - posun v alg., rozměry tabulky, i=0 do tabulky
131  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,13));
132  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_R,
133  ABMD.kon.TAB_D2,4,m+2));
134  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
135  ABMD.kon.TAB_D2,0,1,"0"));
136  for (int i = 0; i < m; i++)
137  { // uloží hledaný řetězec do pole pat
138  pat[i+1] = P.charAt(i);
139  // uloží informace o změně zobrazení - i do tabulky
140  pomI = Integer.valueOf(i+1);
141  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
142  ABMD.kon.TAB_D2,0,i+2,pomI.toString()));
143  // uloží informace o změně zobrazení - pat[i] do tabulky
144  pomC = Character.valueOf(pat[i+1]);
145  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
146  ABMD.kon.TAB_D2,1,i+2,pomC.toString()));
147  }
148 
149  n = T.length(); // délka prohledávaného textu
150  ABMD.pocetKroku++; // vytvoření kroku vizualizace
151  // uloží informace o změně zobrazení - proměnná n, posun v algoritmu
152  pomI = Integer.valueOf(n);
153  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
154  ABMD.kon.PROM_N,pomI.toString()));
155  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,15));
156 
157  text = new char[n + 1];
158  for (int i = 0; i < n; i++)
159  { // uloží prohledávaný řetězec do pole text
160  text[i+1] = T.charAt(i);
161  }
162  ABMD.pocetKroku++; // vytvoření kroku vizualizace
163  // uloží informace o změně zobrazení - posun v algoritmu
164  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,17));
165 
166  ABMD.pocetKroku++; // vytvoření kroku vizualizace
167  // uloží informace o změně zobrazení - záměna bloku, posun na správný řádek
168  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,
169  ABMD.kon.ZADNY_RADEK));
170  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_B,
171  ABMD.kon.BLOK_DELTA1));
172  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,42));
173 
174  vypocetDelta1(); // výpočet tabulky delta1
175 
176  ABMD.pocetKroku++; // vytvoření kroku vizualizace
177  // uloží informace o změně zobrazení - záměna bloku, posun na správný řádek
178  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,
179  ABMD.kon.ZADNY_RADEK));
180  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_B,
181  ABMD.kon.BLOK_BMA));
182  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,20));
183 
184  ABMD.pocetKroku++; // vytvoření kroku vizualizace
185  // uloží informace o změně zobrazení - záměna bloku, posun na správný řádek
186  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,
187  ABMD.kon.ZADNY_RADEK));
188  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_B,
189  ABMD.kon.BLOK_DELTA2));
190  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,54));
191 
192  vypocetDelta2(); // výpočet tabulky delta2
193 
194  ABMD.pocetKroku++; // vytvoření kroku vizualizace
195  // uloží informace o změně zobrazení - záměna bloku, posun na správný řádek,
196  // změna rozměrů tabulky SR
197  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,
198  ABMD.kon.ZADNY_RADEK));
199  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_B,
200  ABMD.kon.BLOK_BMA));
201  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,21));
202  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_R,
203  ABMD.kon.TAB_SR,2,3*m+presah));
204 
205  int i = 1; // pozice v textu
206 
207  ABMD.pocetKroku++; // vytvoření kroku vizualizace
208  // vizualizace - posun v algoritmu, změna popisků, nastavení proměnných,
209  // vložení řetězců do tabulky SR
210  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,23));
211  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_PO,
212  ABMD.kon.POPISEK_IJ,ABMD.kon.TEXTY_POPISKU_IPJ));
213  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_PO,
214  ABMD.kon.POPISEK_MJ,ABMD.kon.TEXTY_POPISKU_NM));
215  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_PO,
216  ABMD.kon.POPISEK_L,ABMD.kon.TEXTY_POPISKU_D1P));
217  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,ABMD.kon.PROM_I,"1"));
218  pomI = Integer.valueOf(n-m+1);
219  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
220  ABMD.kon.PROM_MJ,"1"));
221  for (int z = 0; z < m; z++)
222  { // vložení pat do tabulky SR
223  pomC = Character.valueOf(pat[z+1]);
224  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
225  ABMD.kon.TAB_SR,0,z+m,pomC.toString()));
226  }
227  for (int z = 0; (z < (2*m+presah)) && (vypsano < n); z++)
228  { // vložení textu do tabulky SR
229  pomC = Character.valueOf(text[z+1]);
230  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
231  ABMD.kon.TAB_SR,1,z+m,pomC.toString()));
232  vypsano++; // aktualizace počtu vypsaných znaků
233  }
234 
235  int j = 1; // pozice v pat, kvůli vizualizaci inicializována na 1, která se zahodí
236  Integer d1P; // pomocná delta1
237 
238  ABMD.pocetKroku++; // vytvoření kroku vizualizace
239  // vizualizace - posun v algoritmu
240  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,26));
241 
242 
243  while (i <= (n-m+1))
244  {
245  ABMD.pocetKroku++; // vytvoření kroku vizualizace
246  // vizualizace - odbarvení buněk
247  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
248  ABMD.kon.TAB_D2,0,j+1,
249  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
250  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
251  ABMD.kon.TAB_D2,3,j+1,
252  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
253  for (int z = 3*m+presah-1; z >= 0; z--)
254  { // zkrácení zvýraznění na 1
255  if ((z >= (2*m - 1)) && (z < (2*m)))
256  { // pokud má být buňka zvýrazněná
257  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
258  ABMD.kon.TAB_SR,0,z,
259  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
260  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
261  ABMD.kon.TAB_SR,1,z,
262  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
263  }
264  else
265  { // pokud buňka nemá být zvýrazněná
266  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
267  ABMD.kon.TAB_SR,0,z,
268  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
269  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,
270  ABMD.kon.ZM_T_B,ABMD.kon.TAB_SR,1,z,
271  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
272  }
273  } // zkrácení zvýraznění na 1
274 
275  j = m;
276 
277  // vizualizace - posun v algoritmu, nastavení proměnné
278  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,27));
279  pomI = Integer.valueOf(j);
280  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
281  ABMD.kon.PROM_J,pomI.toString()));
282  pomI = Integer.valueOf(i+j-1);
283  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
284  ABMD.kon.PROM_IJ,pomI.toString()));
285  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
286  ABMD.kon.TAB_D2,0,j+1,
287  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
288  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
289  ABMD.kon.TAB_D2,3,j+1,
290  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
291 
292  ABMD.pocetKroku++; // vytvoření kroku vizualizace
293  // vizualizace - posun v algoritmu, zvýraznění v tabulce
294  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,28));
295  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
296  ABMD.kon.TAB_SR,0,j+m-1,
297  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
298  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
299  ABMD.kon.TAB_SR,1,j+m-1,
300  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
301  zvyrazneno = 1; // aktualizuje počet zvýrazněných sloupců
302 
303  while ((j >= 1) && (pat[j] == text[i+j-1]))
304  { // dokud do chází ke shodě, testuje další znaky
305  ABMD.pocetKroku++; // vytvoření kroku vizualizace
306  // vizualizace - odbarvení buněk
307  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
308  ABMD.kon.TAB_D2,0,j+1,
309  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
310  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
311  ABMD.kon.TAB_D2,3,j+1,
312  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
313 
314  j--;
315 
316  // vizualizace - posun v algoritmu, nastavení proměnných, úprava tabulek
317  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
318  ABMD.kon.TAB_D2,0,j+1,
319  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
320  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
321  ABMD.kon.TAB_D2,3,j+1,
322  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
323  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,29));
324  pomI = Integer.valueOf(j);
325  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
326  ABMD.kon.PROM_J,pomI.toString()));
327  pomI = Integer.valueOf(i+j-1);
328  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
329  ABMD.kon.PROM_IJ,pomI.toString()));
330  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
331  ABMD.kon.TAB_SR,0,j+m-1,
332  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
333  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
334  ABMD.kon.TAB_SR,1,j+m-1,
335  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
336  zvyrazneno++;
337  } // dokud do chází ke shodě, testuje další znaky
338 
339  ABMD.pocetKroku++; // vytvoření kroku vizualizace
340  // vizualizace - posun v algoritmu, úprava tabulek
341  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,30));
342 
343  if (j == 0)
344  { // pokud byl řetězec nalezen
345  ABMD.pocetKroku++; // vytvoření kroku vizualizace
346  // vizualizace - posun v algoritmu, zrušení zvýraznění, nastavení proměnných
347  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,31));
348  for (int z = 0; z < 3*m; z++)
349  { // zrušení zvýraznění v tabulce SR
350  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
351  ABMD.kon.TAB_SR,0,z,
352  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
353  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
354  ABMD.kon.TAB_SR,1,z,
355  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
356  }
357  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
358  ABMD.kon.TAB_D2,0,j+1,
359  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
360  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
361  ABMD.kon.TAB_D2,3,j+1,
362  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
363  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
364  ABMD.kon.PROM_I,""));
365  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
366  ABMD.kon.PROM_J,""));
367  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
368  ABMD.kon.PROM_IJ,""));
369  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
370  ABMD.kon.PROM_MJ,""));
371  pomI = Integer.valueOf(i-1);
372  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
373  ABMD.kon.PROM_POZ,pomI.toString()));
374 
375  return i-1; // řetězec v poli začíná o 1 dál
376  }
377  else
378  { // pokud řetězec nebyl nalezen
379  d1P = delta1.get(text[i+j-1]);
380 
381  ABMD.pocetKroku++; // vytvoření kroku vizualizace
382  // vizualizace - posun v algoritmu, úprava zvýraznění, nastavení proměnných
383  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,33));
384  if (d1P != null)
385  { // pokud d1P není null
386  pomI = Integer.valueOf(d1P);
387  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
388  ABMD.kon.PROM_L,pomI.toString()));
389  pomC = Character.valueOf(text[i+j-1]);
390  pomITD1 = poziceVDelta1.get(pomC);
391  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
392  ABMD.kon.TAB_D1,0,pomITD1,
393  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
394  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
395  ABMD.kon.TAB_D1,1,pomITD1,
396  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
397  }
398  else
399  { // pokud je d1P null
400  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
401  ABMD.kon.PROM_L,"null"));
402  pomITD1 = pocetVDelta1 - 1;
403  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
404  ABMD.kon.TAB_D1,0,pomITD1,
405  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
406  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
407  ABMD.kon.TAB_D1,1,pomITD1,
408  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
409  }
410 
411  if (d1P == null)
412  { // pokud se jedná o znak, který není v kontejneru
413  d1P = delta1Jine;
414 
415  ABMD.pocetKroku++; // vytvoření kroku vizualizace
416  // vizualizace - posun v algoritmu, nastavení proměnné
417  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,35));
418  pomI = Integer.valueOf(d1P);
419  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
420  ABMD.kon.PROM_L,pomI.toString()));
421  }
422  i += Math.max(d1P, delta2[j]); // posun
423 
424  pomPosun = Math.max(d1P, delta2[j]); // uloží hodnotu posunu do pomocné proměnné
425  ABMD.pocetKroku++; // vytvoření kroku vizualizace
426  // vizualizace - posun v algoritmu, nastavení proměnných, úprava tabulek
427  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,36));
428  pomI = Integer.valueOf(i);
429  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
430  ABMD.kon.PROM_I,pomI.toString()));
431  pomI = Integer.valueOf(i+j-1);
432  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
433  ABMD.kon.PROM_IJ,pomI.toString()));
434  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
435  ABMD.kon.PROM_L,""));
436  posun += pomPosun; // aktualizuje posun
437  for (int z = 3*m+presah-1; z >= 0; z--)
438  { // posun zvýraznění vpřed
439  if ((z > (2*m + pomPosun - zvyrazneno - 1)) && (z <= (2*m + pomPosun - 1)))
440  { // pokud má být buňka zvýrazněná
441  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
442  ABMD.kon.TAB_SR,1,z,
443  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
444  }
445  else
446  { // pokud buňka nemá být zvýrazněná
447  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
448  ABMD.kon.TAB_SR,1,z,
449  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
450  }
451  } // posun zvýraznění vpřed
452 
453  ABMD.pocetKroku++; // vytvoření kroku vizualizace
454  // vizualizace - úprava tabulek
455  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
456  ABMD.kon.TAB_D1,0,pomITD1,
457  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
458  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
459  ABMD.kon.TAB_D1,1,pomITD1,
460  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
461  for (int z = 0; z < (3*m+presah); z++)
462  { // posun v tabulce SR
463  pom = posun - m + 1 + z;
464  if (pom <= 0)
465  { // pokud je v mezeře před vypisovaným řetězcem
466  // vyprázdnění obsahu políčka
467  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
468  ABMD.kon.TAB_SR,1,z,""));
469  }
470  else if (pom <= n)
471  { // pokud je ve vypisovaném řetězci
472  pomC = Character.valueOf(text[pom]);
473  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
474  ABMD.kon.TAB_SR,1,z,pomC.toString()));
475  vypsano++; // aktualizace počtu vypsaných znaků
476  }
477  else
478  { // pokud je za vypisovaným řetězcem
479  // vyprázdnění obsahu políčka
480  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
481  ABMD.kon.TAB_SR,1,z,""));
482  }
483  } // posun v tabulce SR
484  for (int z = 3*m+presah-1; z >= 0; z--)
485  { // posun zvýraznění zpět
486  if ((z >= (2*m - zvyrazneno)) && (z < (2*m)))
487  { // pokud má být buňka zvýrazněná
488  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
489  ABMD.kon.TAB_SR,1,z,
490  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
491  }
492  else
493  { // pokud buňka nemá být zvýrazněná
494  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
495  ABMD.kon.TAB_SR,1,z,
496  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
497  }
498  } // posun zvýraznění zpět
499  } // pokud řetězec nebyl nalezen
500  } // while (i <= (n-m+1))
501 
502  ABMD.pocetKroku++; // vytvoření kroku vizualizace
503  // vizualizace - posun v algoritmu, zrušení zvýraznění, nastavení proměnných
504  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,39));
505  for (int z = 0; z < 3*m; z++)
506  { // zrušení zvýraznění v tabulce SR
507  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
508  ABMD.kon.TAB_SR,0,z,
509  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
510  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
511  ABMD.kon.TAB_SR,1,z,
512  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
513  }
514  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
515  ABMD.kon.TAB_D2,0,j+1,
516  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
517  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
518  ABMD.kon.TAB_D2,3,j+1,
519  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
520  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
521  ABMD.kon.PROM_I,""));
522  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
523  ABMD.kon.PROM_J,""));
524  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
525  ABMD.kon.PROM_IJ,""));
526  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
527  ABMD.kon.PROM_MJ,""));
528  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
529  ABMD.kon.PROM_POZ,"-1"));
530  return -1; // řetězec nebyl nalezen
531  } // public int BMA()
532 
533 
534  /**
535  * Metoda pro výpočet tabulky delta1
536  */
537  private void vypocetDelta1()
538  {
539  Integer pomI; // pomocná proměnná pro vizualizaci
540  int pom = 1; // pomocná proměnná pro vizualizaci
541  int pocet = 2; // počet sloupců tabulky delta1
542  int zvyraznenySloupec = 1; // číslo zvýrazněného sloupce v delta1
543 
544  // inicializace kontejneru
545  delta1 = new TreeMap<Character,Integer>();
546  ABMD.pocetKroku++; // vytvoření kroku vizualizace
547  // uloží informace o změně zobrazení - posun v algoritmu, změna rozměrů tabulky delta1
548  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,44));
549  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_R,
550  ABMD.kon.TAB_D1,2,pocet));
551 
552  // výpočet pole delta1 (pro velký počet možných znaků je zde toto pole
553  // nahrazeno kontejnerem pro uvedené znaky a proměnnou pro hodnotu
554  // delta1 neuvedených (jiných) znaků)
555  for (int i = 1; i <= m; i++)
556  { // výpočet delta1
557  ABMD.pocetKroku++; // vytvoření kroku vizualizace
558  // zobrazení - zrušení zvýraznění buněk z minulého cyklu
559  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
560  ABMD.kon.TAB_D2,0,pom+1,
561  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
562  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
563  ABMD.kon.TAB_D2,1,pom+1,
564  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
565 
566  delta1.put(pat[i],(m-i)); // výpočet delta1
567 
568  // zobrazení - posun v algoritmu, výpis i, zvýraznění v tabulce delta2,
569  // výpis tabulky delta1
570  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,49));
571  pomI = Integer.valueOf(i);
572  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
573  ABMD.kon.PROM_I,pomI.toString()));
574  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
575  ABMD.kon.TAB_D2,0,i+1,
576  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
577  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
578  ABMD.kon.TAB_D2,1,i+1,
579  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
580  pom = 1;
581  pocet = 2;
582  for (Iterator pomIter = delta1.keySet().iterator(); pomIter.hasNext();)
583  { // výpis tabulky delta1
584  pocet++; // výpočet počtu sloupců tabulky
585  Character pismeno = (Character)pomIter.next();
586  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
587  ABMD.kon.TAB_D1,0,pom,pismeno.toString()));
588  pomI = delta1.get(pismeno);
589  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
590  ABMD.kon.TAB_D1,1,pom,pomI.toString()));
591  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
592  ABMD.kon.TAB_D1,0,pom,
593  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
594  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
595  ABMD.kon.TAB_D1,1,pom,
596  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
597  if (pat[i] == pismeno)
598  { // pokud se má sloupec zvýraznit
599  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
600  ABMD.kon.TAB_D1,0,pom,
601  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
602  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
603  ABMD.kon.TAB_D1,1,pom,
604  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
605  zvyraznenySloupec = pom;
606  }
607  pom++; // posun na další sloupec
608  } // výpis tabulky delta1
609  // zvětšení tabulky delta1
610  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_R,
611  ABMD.kon.TAB_D1,2,pocet));
612  pom = i;
613  } // výpočet delta1
614 
615  // uložení informací pro vizualizaci
616  pocetVDelta1 = pocet; // počet sloupců tabulky
617  poziceVDelta1 = new TreeMap<Character,Integer>(); // inicializace kontejneru pro pozice v tabulce
618  int pomV = 1;
619  for (Iterator pomIter = delta1.keySet().iterator(); pomIter.hasNext();)
620  { // uložení tabulky delta1
621  Character pismeno = (Character)pomIter.next();
622  poziceVDelta1.put(pismeno,pomV);
623  pomV++;
624  }
625 
626  delta1Jine = m;
627 
628  ABMD.pocetKroku++; // vytvoření kroku vizualizace
629  // uloží informace o změně zobrazení - posun v algoritmu, odbarvení zvýraznění,
630  // vyprázdnění i, přidání položky pro jiné znaky do delta1
631  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,51));
632  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,ABMD.kon.PROM_I,""));
633  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
634  ABMD.kon.TAB_D1,0,zvyraznenySloupec,
635  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
636  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
637  ABMD.kon.TAB_D1,1,zvyraznenySloupec,
638  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
639  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
640  ABMD.kon.TAB_D2,0,pom+1,
641  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
642  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
643  ABMD.kon.TAB_D2,1,pom+1,
644  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
645  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
646  ABMD.kon.TAB_D1,0,pocet-1,ABMD.kon.JINE_ZNAKY));
647  pomI = Integer.valueOf(m);
648  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
649  ABMD.kon.TAB_D1,1,pocet-1,pomI.toString()));
650  } // private void vypocetDelta1()
651 
652 
653  /**
654  * Metoda pro výpočet tabulky delta2
655  */
656  private void vypocetDelta2()
657  {
658  Integer pomI; // pomocná proměnná pro vizualizaci
659  Character pomC; // pomocná proměnná pro vizualizaci
660  int posun = 1; // pomocná proměnná pro vizualizaci - posun 2. řádku tabulky SR
661  // nastavení rozměrů tabulky SR pro vizualizaci hledání podřetězců
662  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_R,
663  ABMD.kon.TAB_SR,2,2*m+1));
664 
665  // inicializace polí
666  delta2 = new int[m+1];
667  shoda = new int[m+1];
668  shoda[m] = 0;
669 
670  ABMD.pocetKroku++; // vytvoření kroku vizualizace
671  // uloží informace o změně zobrazení - posun v algoritmu, nastavení shoda[m], obarvení
672  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,58));
673  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
674  ABMD.kon.TAB_D2,2,m+1,
675  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
676  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
677  ABMD.kon.TAB_D2,2,m+1,"0"));
678 
679  delta2[m] = 1;
680 
681  ABMD.pocetKroku++; // vytvoření kroku vizualizace
682  // uloží informace o změně zobrazení - posun v algoritmu, odbarvení shoda[m],
683  // nastavení a obarvení delta2[m]
684  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,59));
685  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
686  ABMD.kon.TAB_D2,2,m+1,
687  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
688  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
689  ABMD.kon.TAB_D2,3,m+1,
690  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_I));
691  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
692  ABMD.kon.TAB_D2,3,m+1,"1"));
693 
694  ABMD.pocetKroku++; // vytvoření kroku vizualizace
695  // uloží informace o změně zobrazení - posun v algoritmu, odbarvení delta2[m],
696  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,60));
697  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
698  ABMD.kon.TAB_D2,3,m+1,
699  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
700 
701  pomI = Integer.valueOf(m); // pomocná proměnná pro převod do řetězce
702 
703  for (int j = 0; j <= (m-1); j++)
704  {
705  shoda[j] = 1;
706  delta2[j] = m;
707  // uloží informace o změně zobrazení - nastavení obsahů buněk (všechny v 1 kroku)
708  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
709  ABMD.kon.TAB_D2,2,j+1,"1"));
710  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
711  ABMD.kon.TAB_D2,3,j+1,pomI.toString()));
712  // uloží informace o změně zobrazení - obarvení
713  // - všechny buňky budou nastaveny v 1 kroku
714  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
715  ABMD.kon.TAB_D2,0,j+1,
716  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
717  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
718  ABMD.kon.TAB_D2,2,j+1,
719  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
720  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
721  ABMD.kon.TAB_D2,3,j+1,
722  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
723  }
724 
725  ABMD.pocetKroku++; // vytvoření kroku vizualizace
726  // uloží informace o změně zobrazení - odbarvení
727  for (int j = 0; j <= (m-1); j++)
728  { // obarvení - všechny buňky budou nastaveny v 1 kroku vizualizace
729  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
730  ABMD.kon.TAB_D2,0,j+1,
731  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
732  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
733  ABMD.kon.TAB_D2,2,j+1,
734  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
735  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
736  ABMD.kon.TAB_D2,3,j+1,
737  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
738  }
739 
740 
741  // fáze 1: hledání podřetězců shodných s koncem pat
742  int j = 1; // index, od kterého se pat kontroluje
743 
744  // uloží informace o změně zobrazení - nastaví j a m-j+1, posun v algoritmu,
745  // zvýraznění buněk v tabulce
746  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,65));
747  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,ABMD.kon.PROM_J,"1"));
748  pomI = Integer.valueOf(m-j+1);
749  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
750  ABMD.kon.PROM_MJ,pomI.toString()));
751  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
752  ABMD.kon.TAB_D2,0,m-j+2,
753  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
754  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
755  ABMD.kon.TAB_D2,1,m-j+2,
756  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
757  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
758  ABMD.kon.TAB_D2,2,m-j+2,
759  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
760  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
761  ABMD.kon.TAB_D2,3,m-j+2,
762  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
763 
764  int i = m-1; // počet shodných znaků
765 
766  ABMD.pocetKroku++; // vytvoření kroku vizualizace
767  pomI = Integer.valueOf(i); // pomocná proměnná pro převod do řetězce
768  // uloží informace o změně zobrazení - nastaví 1 a i-j+1, posun v algoritmu,
769  // zvýraznění buněk v tabulce
770  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,66));
771  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
772  ABMD.kon.PROM_I,pomI.toString()));
773  pomI = Integer.valueOf(i-j+1);
774  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
775  ABMD.kon.PROM_IJ,pomI.toString()));
776  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
777  ABMD.kon.TAB_D2,0,i-j+2,
778  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
779  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
780  ABMD.kon.TAB_D2,1,i-j+2,
781  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
782  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
783  ABMD.kon.TAB_D2,2,i-j+2,
784  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
785 
786  ABMD.pocetKroku++; // vytvoření kroku vizualizace
787  // vizualizace - posun v algoritmu
788  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,67));
789  for (int z = 0; z < m; z++)
790  { // vizualizace - výpis pat do tabulky SR
791  pomC = Character.valueOf(pat[z+1]);
792  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
793  ABMD.kon.TAB_SR,0,z+1,pomC.toString()));
794  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
795  ABMD.kon.TAB_SR,1,z+1+posun,pomC.toString()));
796  }
797 
798  while (i >= j)
799  {
800  ABMD.pocetKroku++; // vytvoření kroku vizualizace
801  // vizualizace - posun v algoritmu, úprava zvýraznění buněk v tabulce SR
802  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,68));
803  for (int z = 0; z < (2*m+1); z++)
804  { // odbarvení buněk
805  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
806  ABMD.kon.TAB_SR,0,z,
807  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
808  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
809  ABMD.kon.TAB_SR,1,z,
810  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
811  }
812  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
813  ABMD.kon.TAB_SR,0,m-j+1,
814  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
815  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
816  ABMD.kon.TAB_SR,1,i-j+1+posun,
817  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
818 
819  while ((i >= j) && (pat[m-j+1] == pat[i-j+1]))
820  { // nalezení nejdelší shody
821  ABMD.pocetKroku++; // vytvoření kroku vizualizace
822  // vizualizace - posun v algoritmu, odbarvení buněk
823  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,69));
824  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
825  ABMD.kon.TAB_D2,0,m-j+2,
826  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
827  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
828  ABMD.kon.TAB_D2,1,m-j+2,
829  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
830  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
831  ABMD.kon.TAB_D2,2,m-j+2,
832  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
833  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
834  ABMD.kon.TAB_D2,3,m-j+2,
835  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
836  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
837  ABMD.kon.TAB_D2,0,i-j+2,
838  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
839  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
840  ABMD.kon.TAB_D2,1,i-j+2,
841  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
842  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
843  ABMD.kon.TAB_D2,2,i-j+2,
844  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
845 
846  j++;
847 
848  // vizualizace - úprava tabulek a proměnných
849  pomI = Integer.valueOf(j);
850  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
851  ABMD.kon.PROM_J,pomI.toString()));
852  pomI = Integer.valueOf(i-j+1);
853  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
854  ABMD.kon.PROM_IJ,pomI.toString()));
855  pomI = Integer.valueOf(m-j+1);
856  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
857  ABMD.kon.PROM_MJ,pomI.toString()));
858  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
859  ABMD.kon.TAB_D2,0,i-j+2,
860  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
861  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
862  ABMD.kon.TAB_D2,1,i-j+2,
863  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
864  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
865  ABMD.kon.TAB_D2,2,i-j+2,
866  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
867  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
868  ABMD.kon.TAB_D2,0,m-j+2,
869  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
870  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
871  ABMD.kon.TAB_D2,1,m-j+2,
872  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
873  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
874  ABMD.kon.TAB_D2,2,m-j+2,
875  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
876  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
877  ABMD.kon.TAB_D2,3,m-j+2,
878  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
879  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
880  ABMD.kon.TAB_SR,0,m-j+1,
881  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
882  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
883  ABMD.kon.TAB_SR,1,i-j+1+posun,
884  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
885  shoda[i-j+1] = j;
886  ABMD.pocetKroku++; // vytvoření kroku vizualizace
887  // vizualizace - posun v algoritmu, úprava tabulek
888  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,70));
889  pomI = Integer.valueOf(j);
890  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
891  ABMD.kon.TAB_D2,2,i-j+2,pomI.toString()));
892  } // while ((i >= j) && ...
893  ABMD.pocetKroku++; // vytvoření kroku vizualizace
894  // vizualizace - posun v algoritmu
895  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,72));
896  if (j > 1)
897  { // pokud byla nalezena shoda, provede aktualizaci
898  delta2[m-j+1] = Math.min(m-i, delta2[m-j+1]);
899  ABMD.pocetKroku++; // vytvoření kroku vizualizace
900  // vizualizace - posun v algoritmu, úprava tabulky
901  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,73));
902  pomI = Integer.valueOf(delta2[m-j+1]);
903  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
904  ABMD.kon.TAB_D2,3,m-j+2,pomI.toString()));
905  }
906  ABMD.pocetKroku++; // vytvoření kroku vizualizace
907  // vizualizace - odbarvení zvýrazněných buněk
908  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
909  ABMD.kon.TAB_D2,0,i-j+2,
910  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
911  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
912  ABMD.kon.TAB_D2,1,i-j+2,
913  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
914  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
915  ABMD.kon.TAB_D2,2,i-j+2,
916  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
917  for (int z = 0; z < (2*m+1); z++)
918  { // odbarvení buněk
919  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
920  ABMD.kon.TAB_SR,0,z,
921  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
922  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
923  ABMD.kon.TAB_SR,1,z,
924  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
925  }
926 
927  pomI = Integer.valueOf(i); // původní hodnota i pro posun tabulky
928 
929  i = i-j+shoda[m-j+1];
930 
931  // vizualizace - posun v algoritmu, úprava tabulek a proměnných
932  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_P,
933  ABMD.kon.TAB_SR,1,
934  ABMD.kon.POSUN_VPRAVO,pomI-i));
935  posun += pomI-i;
936  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,74));
937  if (i-j+2 > 0)
938  { // pokud souřadnice nejsou mimo tabulku
939  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
940  ABMD.kon.TAB_D2,0,i-j+2,
941  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
942  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
943  ABMD.kon.TAB_D2,1,i-j+2,
944  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
945  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
946  ABMD.kon.TAB_D2,2,i-j+2,
947  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
948  }
949  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
950  ABMD.kon.TAB_SR,0,m-j+1,
951  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
952  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
953  ABMD.kon.TAB_SR,1,i-j+1+posun,
954  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
955 
956  pomI = Integer.valueOf(i);
957  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
958  ABMD.kon.PROM_I,pomI.toString()));
959  pomI = Integer.valueOf(i-j+1);
960  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
961  ABMD.kon.PROM_IJ,pomI.toString()));
962 
963  ABMD.pocetKroku++; // vytvoření kroku vizualizace
964  // vizualizace - odbarvení zvýrazněných buněk
965  if (i-j+2 > 0)
966  { // pokud souřadnice nejsou mimo tabulku
967  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
968  ABMD.kon.TAB_D2,0,i-j+2,
969  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
970  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
971  ABMD.kon.TAB_D2,1,i-j+2,
972  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
973  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
974  ABMD.kon.TAB_D2,2,i-j+2,
975  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
976  }
977  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
978  ABMD.kon.TAB_D2,0,m-j+2,
979  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
980  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
981  ABMD.kon.TAB_D2,1,m-j+2,
982  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
983  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
984  ABMD.kon.TAB_D2,2,m-j+2,
985  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
986  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
987  ABMD.kon.TAB_D2,3,m-j+2,
988  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
989  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
990  ABMD.kon.TAB_SR,0,m-j+1,
991  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
992  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
993  ABMD.kon.TAB_SR,1,i-j+1+posun,
994  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
995 
996  j = Math.max(shoda[m-j+1],1);
997 
998  // vizualizace - posun v algoritmu, úprava tabulek a proměnných
999  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,75));
1000  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1001  ABMD.kon.TAB_D2,0,i-j+2,
1002  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
1003  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1004  ABMD.kon.TAB_D2,1,i-j+2,
1005  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
1006  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1007  ABMD.kon.TAB_D2,2,i-j+2,
1008  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
1009  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1010  ABMD.kon.TAB_D2,0,m-j+2,
1011  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
1012  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1013  ABMD.kon.TAB_D2,1,m-j+2,
1014  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
1015  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1016  ABMD.kon.TAB_D2,2,m-j+2,
1017  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
1018  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1019  ABMD.kon.TAB_D2,3,m-j+2,
1020  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
1021  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1022  ABMD.kon.TAB_SR,0,m-j+1,
1023  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_MJ));
1024  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1025  ABMD.kon.TAB_SR,1,i-j+1+posun,
1026  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_IJ));
1027  pomI = Integer.valueOf(j);
1028  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1029  ABMD.kon.PROM_J,pomI.toString()));
1030  pomI = Integer.valueOf(i-j+1);
1031  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1032  ABMD.kon.PROM_IJ,pomI.toString()));
1033  pomI = Integer.valueOf(m-j+1);
1034  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1035  ABMD.kon.PROM_MJ,pomI.toString()));
1036  } // while (i >= j)
1037 
1038  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1039  // vizualizace - odbarvení zvýrazněných buněk, vyprázdnění tabulky SR,
1040  // vyprázdnění nepotřebných proměnných
1041  for (int z = 0; z < (2*m+1); z++)
1042  { // odbarvení a vyprázdnění buněk
1043  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1044  ABMD.kon.TAB_SR,0,z,
1045  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1046  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1047  ABMD.kon.TAB_SR,1,z,
1048  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1049  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
1050  ABMD.kon.TAB_SR,0,z,""));
1051  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
1052  ABMD.kon.TAB_SR,1,z,""));
1053  }
1054  if (i-j+2 > 0)
1055  { // pokud souřadnice nejsou mimo tabulku
1056  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1057  ABMD.kon.TAB_D2,0,i-j+2,
1058  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1059  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1060  ABMD.kon.TAB_D2,1,i-j+2,
1061  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1062  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1063  ABMD.kon.TAB_D2,2,i-j+2,
1064  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1065  }
1066  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1067  ABMD.kon.TAB_D2,0,m-j+2,
1068  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1069  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1070  ABMD.kon.TAB_D2,1,m-j+2,
1071  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1072  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1073  ABMD.kon.TAB_D2,2,m-j+2,
1074  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1075  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1076  ABMD.kon.TAB_D2,3,m-j+2,
1077  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1078  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1079  ABMD.kon.PROM_MJ,""));
1080  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1081  ABMD.kon.PROM_IJ,""));
1082 
1083  // fáze 2: výpočet tabulky posunutí
1084  int t = shoda[0]; // délka shodného řetězce s koncem pat
1085  // vizualizace - posun v algoritmu, nastavení proměnné, zvýraznění
1086  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,78));
1087  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1088  ABMD.kon.TAB_D2,2,1,
1089  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_T));
1090  pomI = Integer.valueOf(shoda[0]);
1091  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1092  ABMD.kon.PROM_T,pomI.toString()));
1093 
1094  int L = 1; // aktuální znak pat
1095 
1096  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1097  // vizualizace - posun v algoritmu, nastavení proměnné, zvýraznění
1098  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,79));
1099  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1100  ABMD.kon.TAB_D2,2,1,
1101  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1102  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1103  ABMD.kon.PROM_L,"1"));
1104 
1105  int s = 1; // maximální posunutí úseku, hodnota 1 doplněna pro vizualizaci
1106  while (t > 0)
1107  {
1108  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1109  // vizualizace - odbarvení zvýrazněných buněk
1110  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1111  ABMD.kon.TAB_D2,2,s+1,
1112  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1113 
1114  s = m-t+1;
1115 
1116  // vizualizace - posun v algoritmu, nastavení proměnné, zvýraznění
1117  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,82));
1118  pomI = Integer.valueOf(s);
1119  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1120  ABMD.kon.PROM_S,pomI.toString()));
1121  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1122  ABMD.kon.TAB_D2,0,s+1,
1123  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_S));
1124  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1125  ABMD.kon.TAB_D2,2,s+1,
1126  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_S));
1127 
1128  for (j = L; j <= s; j++)
1129  {
1130  delta2[j] = Math.min(delta2[j], s);
1131 
1132  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1133  // vizualizace - posun v algoritmu, úprava proměnné,
1134  // odbarvení zvýrazněných buněk úprava tabulky, zvýraznění
1135  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,84));
1136  pomI = Integer.valueOf(j);
1137  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1138  ABMD.kon.PROM_J,pomI.toString()));
1139  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1140  ABMD.kon.TAB_D2,0,j,
1141  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1142  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1143  ABMD.kon.TAB_D2,3,j,
1144  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1145  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1146  ABMD.kon.TAB_D2,0,j+1,
1147  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
1148  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1149  ABMD.kon.TAB_D2,3,j+1,
1150  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_J));
1151  pomI = Integer.valueOf(delta2[j]);
1152  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_H,
1153  ABMD.kon.TAB_D2,3,j+1,pomI.toString()));
1154  } // for (j = L; j <= s; j++)
1155 
1156  t = shoda[s];
1157 
1158  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1159  // vizualizace - posun v algoritmu, nastavení proměnné
1160  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,86));
1161  pomI = Integer.valueOf(shoda[s]);
1162  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1163  ABMD.kon.PROM_T,pomI.toString()));
1164 
1165  L = s+1;
1166 
1167  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1168  // vizualizace - posun v algoritmu, odbarvení zvýrazněných buněk, nastavení proměnné
1169  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,87));
1170  pomI = Integer.valueOf(L);
1171  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1172  ABMD.kon.PROM_L,pomI.toString()));
1173  } // while (t > 0)
1174 
1175  ABMD.pocetKroku++; // vytvoření kroku vizualizace
1176  // vizualizace - posun v algoritmu, odbarvení zvýrazněných buněk v tabulkách,
1177  // vyprázdnění proměnných
1178  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_A_Z,89));
1179  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1180  ABMD.kon.TAB_D2,0,j,
1181  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1182  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1183  ABMD.kon.TAB_D2,3,j,
1184  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1185  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_T_B,
1186  ABMD.kon.TAB_D2,2,s+1,
1187  ABMD.kon.BARVA_CERNA,ABMD.kon.BARVA_BILA));
1188  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1189  ABMD.kon.PROM_I,""));
1190  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1191  ABMD.kon.PROM_J,""));
1192  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1193  ABMD.kon.PROM_S,""));
1194  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1195  ABMD.kon.PROM_T,""));
1196  ABMD.prubehViz.add(new ZmenaZobrazeni(ABMD.pocetKroku,ABMD.kon.ZM_P,
1197  ABMD.kon.PROM_L,""));
1198  } // private void vypocetDelta2()
1199 
1200 } // public class Algoritmus
1201 
1202  /*** Konec souboru Algoritmus.java ***/
1203 
static final int PROM_IJ
Definition: Konstanty.java:98
static final int ZADNY_RADEK
Definition: Konstanty.java:584
static final int ZM_T_H
Definition: Konstanty.java:64
static final int ZM_P
Definition: Konstanty.java:76
static final int POPISEK_L
Definition: Konstanty.java:115
static final int PROM_S
Definition: Konstanty.java:102
static final int ZM_T_R
Definition: Konstanty.java:70
TreeMap< Character, Integer > poziceVDelta1
Definition: Algoritmus.java:67
static final Color BARVA_IJ
Definition: Konstanty.java:51
Vyhledávání v řetězci a tvorba seznamu změn GUI.
Definition: Algoritmus.java:43
static final Color BARVA_I
Definition: Konstanty.java:47
static final int BLOK_DELTA1
Definition: Konstanty.java:577
static final int TAB_D1
Definition: Konstanty.java:85
static final String JINE_ZNAKY
Definition: Konstanty.java:589
static final int PROM_POZ
Definition: Konstanty.java:108
static final int POSUN_VPRAVO
Definition: Konstanty.java:133
static final String TEXTY_POPISKU_IPJ
Definition: Konstanty.java:120
static final int TAB_D2
Definition: Konstanty.java:87
static final Color BARVA_MJ
Definition: Konstanty.java:53
static final int [] TAB_SR_VR
Definition: Konstanty.java:136
ArrayList< ZmenaZobrazeni > prubehViz
static final int PROM_L
Definition: Konstanty.java:106
static final int ZM_T_P
Definition: Konstanty.java:68
Applet pro demonstraci BMA, základ projektu.
static final int PROM_I
Definition: Konstanty.java:94
int BMA(String P, String T)
Definition: Algoritmus.java:92
static final Color BARVA_CERNA
Definition: Konstanty.java:42
static final int ZM_PO
Definition: Konstanty.java:80
static final int PROM_M
Definition: Konstanty.java:90
static final String TEXTY_POPISKU_D1P
Definition: Konstanty.java:128
static final String TEXTY_POPISKU_NM
Definition: Konstanty.java:124
static final int BLOK_BMA
Definition: Konstanty.java:575
static final int PROM_J
Definition: Konstanty.java:96
TreeMap< Character, Integer > delta1
Definition: Algoritmus.java:58
Algoritmus(AppletBoyerMooreDemo apABMD)
Definition: Algoritmus.java:77
static final int PROM_T
Definition: Konstanty.java:104
static final int POPISEK_MJ
Definition: Konstanty.java:113
static final int POPISEK_IJ
Definition: Konstanty.java:111
static final int ZM_A_B
Definition: Konstanty.java:72
static final int TAB_SR
Definition: Konstanty.java:83
static final Color BARVA_S
Definition: Konstanty.java:55
static final int PROM_MJ
Definition: Konstanty.java:100
Uchování informací o změnách zobrazení při vizualizaci.
static final int PROM_N
Definition: Konstanty.java:92
AppletBoyerMooreDemo ABMD
Definition: Algoritmus.java:47
static final int ZM_T_B
Definition: Konstanty.java:66
static final int ZM_A_Z
Definition: Konstanty.java:74
static final Color BARVA_BILA
Definition: Konstanty.java:44
static final Color BARVA_J
Definition: Konstanty.java:49
static final int BLOK_DELTA2
Definition: Konstanty.java:579
static final Color BARVA_T
Definition: Konstanty.java:57