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.