|
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 quadratic residue 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 quadratic_residue(int hodnota, int pokus, int p_riadkov) {
int riadok;
if (pokus==0) riadok = hodnota % p_riadkov;
else {
int odskok = (pokus + 1) / 2;
if (pokus%2==0) {
riadok = (hodnota - odskok*odskok) % p_riadkov;
while (riadok < 0) riadok+=p_riadkov;
}
else riadok = (hodnota + odskok*odskok) % 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,4526 |
101 |
246,0 |
95,00 |
2,589 |
0,6430 |
997 |
3372,0 |
947,0 |
3,561 |
0,8458 |
10.007 |
54688,0 |
9506,0 |
5,753 |
1,315 |
|
Ako je vidno z nameraných hodnôt, efektivita tejto metódy sa zdá by» pre vysoké zaplnenie tabuµky opä» závislá na jej veµkosti. |
|
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,3568 |
101 |
165,0 |
75,00 |
2,200 |
0,5313 |
997 |
1519,0 |
747,0 |
2,033 |
0,5194 |
10.007 |
14454,0 |
7505,0 |
1,926 |
0,4963 |
|
Pre nízke zaplnenie je sledovaný pomer stabilný a nijak veµmi sa nemení. |
Závislost dĺľky času trvania algoritmu od veµkosti vstupného pola |
Pri vysokom zaplnení tabuµky je čas znova závislý od veµkosti tabuµky. |
|
|
11 |
101 |
997 |
10007 |
zaplnenie tabuµky je 95% |
0,4530 |
0,6430 |
0,8460 |
1,315 |
zaplnenie tabuµky je 75% |
0,3570 |
0,5310 |
0,5190 |
0,4960 |
|
|
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. |