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.