|
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 displaced 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 displaced_linear_probing(int hodnota, int pokus, int p_riadkov) {
const int odskok=2;
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 |
14,00 |
10,00 |
1,400 |
0,4035 |
101 |
424,0 |
95,00 |
4,463 |
1,008 |
997 |
6333,0 |
947,0 |
6,687 |
1,47 |
10,007 |
269317,0 |
9506,0 |
28,33 |
5,836 |
|
Pomer pokusov a nájdení sa pre zväčšujúcu zväčšuje. Táto metóda síce zmenšila závislosť sledovaného pomeru od veľkosti tabuľky, nie však na toľko, aby sme boli so sledovaným pomerom spokojný. |
|
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 |
179,0 |
75,00 |
2,387 |
0,5616 |
997 |
1968,0 |
747,0 |
2,635 |
0,6212 |
10,007 |
19885,0 |
7505,0 |
2,65 |
0,6217 |
|
Pre nízke zaplnenie tabuľky je sledovaný pomer stabilný a nezdá sa, že by bol na rastúcej veľkosti tabuľky závislý. |
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Pre vysoké zaplnenie tabuľky je čas vyhľadávania závislý aj od veľkosti poľa. |
|
|
11 |
101 |
997 |
10007 |
zaplnenie tabuľky je 95% |
0,4040 |
1,008 |
1,470 |
5,836 |
zaplnenie tabuľky je 75% |
0,3560 |
0,5620 |
0,6210 |
0,6220 |
|
|
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. |