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.