Algoritmy pre rozptyľové tabuľky s otvoreným rozptyľovaním

Rozptyľová funkcia quadratic residue

Popis

Ďalší algoritmus sa snaží zamedziť javu primary clustering iným spôsobom. Je to voľbou inej sekvencie skúšania položiek. Od prvej skúšanej položky potom ďalšie kvadraticky rozmieta do oboch smerov. Najprv vyskúša položku o 1^2 vpred, potom o 1^2 vzad, potom o 2^2 vpred, 2^2 vzad, potom o 3^2 vpred a tak ďalej.

Vstupy algoritmu

Vstupmi sú rozptyľová tabuľka so zadaným počtom riadkov a vyhľadávaná hodnota v tabuľke.

Príklad rozptylovej funkcie a sekvencia skúšaných položiek

h(k) = f(k) mod 23
h(k) = [f(k) + 1^2] mod 23
h(k) = [f(k) - 1^2] mod 23
h(k) = [f(k) + 2^2] mod 23
h(k) = [f(k) - 2^2] mod 23
...

2, 3, 1, 6, 21, 11, 16, 4, 0, 15, 12, 5, 22, 20, ...

Výstupy algoritmu

V prípade úspešného vyhľadávania je výstupom index riadku v tabuľke, kde bola vyhľadávaná hodnota nájdená. V prípade že pri hľadaní nájdeme prázdnu položku alebo počet vykonaných pokusov je rovný veľkosti tabuľky, algoritmus sa končí neúspechom a návratová hodnota je -1.

Vývojový diagram

Implementácia

//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;
}

Vizualizácie

Časová zložitosť

Časová zložitosť sa nedá presne určiť a závisí od hodnôt, ktoré budú do tabuľky vkladané. Efektivita metódy bude určená na základe nameraných hodnôt.