|
Grafy a tabuľky |
Vyhľadávanie pri otvorenom rozptyľovaní
|
Priemerné počty porovnaní vybraných implementácií |
//najdenie zadanej hodnoty "hodnota" v rozptylovej tabulke s otvorenym rozptylovanim
//funkcia vracia index polozky v ktorej bola hodnota najdena (v pripade neuspechu vracia -1)
int CTabulka_OR::najdi(int hodnota) {
int pokus=0;
while (++p_pokusov_ && pokus < POCET_POLOZIEK_V_TABULKE) {
int riadok = funkcia_1(hodnota, pokus);
if (tabulka_[riadok].prazdna()) return -1;
else if (tabulka_[riadok].hodnota()==hodnota) {
p_vlozeni_++;
return riadok;
}
else pokus++;
}
return -1;
}
//volanie funkcie na zaklade zadaneho sposobu riesenia kolizii (uchovavaneho v clenskej
//premennej SRK_), ktora vypocita na zaklade zadanej vkladanej hodnoty "hodnota" a
//poctu predchadzajucich neuspesnych pokusov "pokus", kam bude zadana hodnota vlozena
//funkcia vracia index polozky, do ktorej ma byt zadana hodnota ulozena
int CTabulka_OR::funkcia_1(int hodnota, int pokus) {
switch (SRK_) {
case 1 : return linear_probing(hodnota, pokus);
case 2 : return displaced_linear_probing(hodnota, pokus);
case 3 : return secondary_clustering(hodnota, pokus);
case 4 : return quadratic_residue(hodnota, pokus);
case 5 : return double_hashing(hodnota, pokus);
}
} |
//vypocitanie polozky do ktorej bude zadana hodnota "hodnota"
//vlozena metodou linear probing vzhladom na predchadzajuce
//mnozstvo neuspesnych pokusov "pokus" vlozenia tohto prvku
//a pocet riadkov "p_riadkov" v rozptylovej tabulke
//funkcia vracia index polozky do ktorej ma byt zadana hodnota vlozena
int linear_probing(int hodnota, int pokus, int p_riadkov) {
const int odskok=1;
int riadok = (hodnota + odskok*pokus) % p_riadkov;
return riadok;
} |
Počet porovnaní, cyklov a času trvania algoritmu pre 95% zaplnenie tabuľky. |
počet prvkov v tabuľke |
p_pokusov_ |
p_najdeni_ |
p_pok/p_naj |
čas |
11 |
17,00 |
10,00 |
1,700 |
0,4506 |
101 |
289,0 |
95,00 |
3,042 |
0,7210 |
997 |
7050,0 |
947,0 |
7,445 |
1,618 |
10.007 |
1229007 |
9506,0 |
129,3 |
25,86 |
|
Pre zväčšujúca sa tabuľku sa zväčšuje aj pomer pokusov o vloženie a vložení samotných. Je to z dôvodu vznikania súvislých oblastí v tabuľke, kde sa nenachádza žiaden voľný riadok. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre 75% zaplnenie tabuľky. |
počet prvkov v tabuľke |
p_pokusov_ |
p_najdeni_ |
p_pok/p_naj |
čas |
11 |
11,00 |
8,000 |
1,375 |
0,3555 |
101 |
162,0 |
75,00 |
2,160 |
0,5137 |
997 |
1905,0 |
747,0 |
2,550 |
0,6104 |
10,007 |
21396,0 |
7505,0 |
2,851 |
0,6618 |
|
Aj tu je vidno vplyv vznikania zhlukov zaplnených riadkov v tabuľke, ale keďže nie je zaplnenie tabuľky vysoké je tento vplyv menší. |
|
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Ako je vidno pri tomto spôsobe riešenia kolízií, je vyhľadávací čas závislý aj od veľkosti tabuľky a aj od jej zaplnenosti. Pre menšie zaplnenie je vyhľadávací čas kratší. |
 |
|
11 |
101 |
997 |
10007 |
zaplnenie tabuľky je 95% |
0,4510 |
0,7210 |
1,618 |
25,86 |
zaplnenie tabuľky je 75% |
0,3560 |
0,5140 |
0,6100 |
0,6620 |
|
|
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. |