|
Grafy a tabuľky |
Vyhľadávanie algoritmom Brute force
|
Priemerné počty porovnaní vybraných implementácií |
//obycajne sekvencne vyhladavanie zadaneho vzoru "vzor" s poctom znakov "dlzka"
//funkcia vracia index prveho znaku najdeneho vzoru v retazci
//(v pripade neuspechu vyhladavania vracia -1)
int CRetazec::najdi_sekv(char* vzor, int dlzka){
for (int j=0; ++p_a_porovnani_ && j < velkost()-dlzka+1; j++){
for (int i=0; ++p_a_porovnani_ && i < dlzka; i++) {
if(++p_b_porovnani_ && retazec_[j+i] != vzor[i]) break;
}
if (++p_b_porovnani_ && i == dlzka) {
return j;
}
}
return -1;
} |
Počet porovnaní, cyklov a času trvania algoritmu pre veľkosť abecedy=3 znaky, veľkosť vzoru=3 znaky. |
počet znakov v prehľadávanom reťazci |
p_a_porovnani_ |
p_b_porovnani_ |
čas |
10 |
20,00 |
19,00 |
0,2020 |
100 |
242,0 |
238,0 |
2,450 |
1.000 |
2474,0 |
2435,0 |
25,27 |
10.000 |
24708,0 |
24352,0 |
249,4 |
100.000 |
247619,0 |
244005,0 |
2520,0 |
|
Z nameraných hodnôt môžeme vidieť, že súčet porovnaní je približne rovný 5-násobku dĺžky prehľadávaného reťazca. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre veľkosť abecedy=24 znakov, veľkosť vzoru=3 znaky. |
počet znakov v prehľadávanom reťazci |
p_a_porovnani_ |
p_b_porovnani_ |
čas |
10 |
18,00 |
17,00 |
0,1514 |
100 |
203,0 |
202,0 |
1,191 |
1.000 |
2039,0 |
2038,0 |
11,13 |
10.000 |
20416,0 |
20414,0 |
110,3 |
100.000 |
204281,0 |
204273,0 |
1109,0 |
|
Z nameraných hodnôt môžeme vidieť, že súčet porovnaní je približne rovný 4-násobku dĺžky prehľadávaného reťazca. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre veľkosť abecedy=3 znaky, veľkosť vzoru=9 znakov. |
počet znakov v prehľadávanom reťazci |
p_a_porovnani_ |
p_b_porovnani_ |
čas |
10 |
6,000 |
5,000 |
0,0881 |
100 |
229,0 |
228,0 |
2,303 |
1.000 |
2460,0 |
2458,0 |
24,67 |
10.000 |
24924,0 |
24922,0 |
249,9 |
100.000 |
249339,0 |
249332,0 |
2493,0 |
|
Z nameraných hodnôt môžeme vidieť, že súčet porovnaní je približne rovný 5-násobku dĺžky prehľadávaného reťazca. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre veľkosť abecedy=24 znakov, veľkosť vzoru=9 znakov. |
počet znakov v prehľadávanom reťazci |
p_a_porovnani_ |
p_b_porovnani_ |
čas |
10 |
6,000 |
5,000 |
0,0883 |
100 |
192,0 |
191,0 |
1,164 |
1.000 |
2028,0 |
2027,0 |
11,01 |
10.000 |
20409,0 |
20408,0 |
110,8 |
100.000 |
204284,0 |
204283,0 |
1111,5 |
|
Z nameraných hodnôt môžeme vidieť, že súčet porovnaní je približne rovný 4-násobku dĺžky prehľadávaného reťazca. |
|
|
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Dĺžka času prehľadávania reťazca závisí podľa nameraných hodnôt najmä od veľkosti abecedy. Keďže pre malé abecedy je vysoká pravdepodobnosť zhody znakov (0. znaku vzoru a aktuálneho znaku v reťazci), algoritmus často vykonáva porovnanie aj s 1. a nasledujúcimi znakmi vzoru a preto je časovo náročnejší. Ak je abeceda veľká, prichádza väčšinou len k neúspešnému porovnaniu 0. znaku vzoru s reťazcom a následne posunutiu vzoru na ďalšiu možnú vyhovujúcu pozíciu. Závislosť dĺžky času vykonávania od veľkosti prehľadávaného reťazca je lineárna. |
|
|
10 |
100 |
1.000 |
10.000 |
100.000 |
veľkosť abecedy=3 znaky, dĺžka vzoru=3 znaky |
0,2020 |
2,450 |
25,27 |
249,5 |
2520,0 |
veľkosť abecedy=24 znakov, dĺžka vzoru=3 znaky |
0,1514 |
1,191 |
11,13 |
110,3 |
1109,0 |
veľkosť abecedy=3 znaky, dĺžka vzoru=9 znakov |
0,0881 |
2,303 |
24,67 |
250,0 |
2493,0 |
veľkosť abecedy=24 znakov, dĺžka vzoru=9 znakov |
0,0883 |
1,164 |
11,01 |
110,9 |
1111,5 |
|
|
|
Poznámka: Algoritmy boli testované na počítači s procesorom AMD Athlon(tm) XP 1700+ a s 256 MB operačnou pamäťou pod operačným systémom Windows XP. Všetky časy uvedené v tabuľke sú v mikrosekundách. |