|
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 secondary clustering 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 secondary_clustering(int hodnota, int pokus, int p_riadkov) {
int odskok = (hodnota + 4) % p_riadkov;
if (odskok==0) 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 |
14,00 |
10,00 |
1,400 |
0,4376 |
101 |
315,0 |
95,00 |
3,316 |
0,8866 |
997 |
3148,0 |
947,0 |
3,324 |
0,8986 |
10,007 |
27668,0 |
9506,0 |
2,911 |
0,8101 |
|
Pomer pokusov o vloženie a vložení sa pre zväčšujúcu sa tabuľku prvý krát zmenšil. Je to dobré znamenie, že táto metóda by mohla byť stabilná pre meniacu sa veľkosť tabuľky. Navyše je pre tri zo štyroch testovaných veľkostí v sledovanom pomere najefektívnejšia. |
|
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,3730 |
101 |
162,0 |
75,00 |
2,160 |
0,5872 |
997 |
1374,0 |
747,0 |
1,839 |
0,5154 |
10,007 |
13011,0 |
7505,0 |
1,734 |
0,4950 |
|
Pre nízke zaplnenie tabuľky je zo sledovaného pomeru vidno, že tento spôsob riešenia kolízii je veľmi dobrý a rozptyľuje hodnoty do tabuľky aj v prípade kolízie veľmi efektívne. |
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Táto metóda riešenia kolízií sa zdá byť nezávislá od veľkosti tabuľky. Časy sú približne rovnaké pre všetky testované veľkosti tabuľky. |
|
|
11 |
101 |
997 |
10007 |
zaplnenie tabuľky je 95% |
0,4380 |
0,8870 |
0,8990 |
0,8100 |
zaplnenie tabuľky je 75% |
0,3730 |
0,5870 |
0,5150 |
0,4950 |
|
|
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. |