Implementácie

Vyhµadávanie pri otvorenom rozptyµovaní

 
 
//najdenie zadanej hodnoty "hodnota" v rozptylovej tabulke "tabulka"
//s otvorenym rozptylovanim s poctom riadkov "p_riadkov" 
//funkcia vracia index polozky v ktorej bola hodnota najdena (v pripade neuspechu vracia -1)
int najdi_OR(Criadok_OR* tabulka, int p_riadkov, int hodnota, int sposob) {
	int pokus=0;
	while (pokus < p_riadkov) {
		int riadok = funkcia_OR(p_riadkov, hodnota, pokus, sposob);
		if (tabulka[riadok].prazdna()) return -1;
		else if (tabulka[riadok].hodnota()==hodnota) return riadok;
		else pokus++;
	}
	return -1;
}
 
//vlozenie zadanej hodnoty "hodnota" do rozptylovej tabulky "tabulka"
//s otvorenym rozptylovanim s poctom riadkov "p_riadkov" 
//funkcia vracia index polozky do ktorej bola hodnota vlozena (v pripade neuspechu vracia -1)
int vloz_OR(Criadok_OR* tabulka, int p_riadkov, int hodnota, int sposob) {
	int pokus=0;
	while (pokus < p_riadkov) {
		int riadok = funkcia_OR(p_riadkov, hodnota, pokus, sposob);
		if (tabulka[riadok].prazdna()) {
			tabulka[riadok].nastav_hodnotu(hodnota);
			tabulka[riadok].nastav_priznak(false);
			return riadok;
		}
		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
//zadana hodnota bude vlozena do tabulky "tabulka" s poctom riadkov "p_riadkov"
//funkcia vracia index polozky, do ktorej ma byt zadana hodnota ulozena
int funkcia_OR(int p_riadkov, int hodnota, int pokus, int sposob) {
	switch (sposob) {
		case 1 :	return linear_probing(hodnota, pokus, p_riadkov);
		case 2 :	return displaced_linear_probing(hodnota, pokus, p_riadkov);
		case 3 :	return secondary_clustering(hodnota, pokus, p_riadkov);
		case 4 :	return quadratic_residue(hodnota, pokus, p_riadkov);
		case 5 :	return double_hashing(hodnota, pokus, p_riadkov);
	}
}
 
//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;

}