|
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 double hashing 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 double_hashing(int hodnota, int pokus, int p_riadkov) {
if (pokus%2==0) {
return quadratic_residue(hodnota, pokus/2, p_riadkov);
}
else return secondary_clustering(hodnota, (pokus+1)/2, p_riadkov);
} |
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,4576 |
101 |
230,0 |
95,00 |
2,421 |
0,7260 |
997 |
3320,0 |
947,0 |
3,506 |
1,004 |
10.007 |
28057,0 |
9506,0 |
2,952 |
0,8807 |
|
Pri tejto metóde riešenia kolízií sa zdá, že sme opäť eliminovali závislosť sledovaného pomeru od veľkosti tabuľky. |
|
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 |
10,00 |
8,000 |
1,250 |
0,4030 |
101 |
144,0 |
75,00 |
1,920 |
0,5652 |
997 |
1419,0 |
747,0 |
1,900 |
0,5649 |
10.007 |
12975,0 |
7505,0 |
1,729 |
0,5203 |
|
Metódou double hashing sme dosiahli veľmi dobré výsledky. Pri troch sledovaných veľkostiach tabuľky zo štyroch je sledovaný pomer práve pre túto metódu najlepší. |
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Čas vyhľadávania nie je nijak veľmi závislý na veľkosti tabuľky. |
|
|
11 |
101 |
997 |
10007 |
zaplnenie tabuľky je 95% |
0,4580 |
0,7260 |
1,004 |
0,8810 |
zaplnenie tabuľky je 75% |
0,4030 |
0,5650 |
0,5650 |
0,5200 |
|
|
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. |