tirriainen
4/14/2018 - 1:53 PM

lineaarinen hajautus.php

<?php

function add(&$array, $value, $m) {
	for ($i = 0; $i < $m; $i++) {
		$j = hash_function($value, $i, $m); // hajautetaan lisättävän alkion avain k indeksiksi h(k) väliltä [0, m − 1]
		
		if (!array_key_exists($j, $array)) {
			$array[$j] = $value;
			return true; // onnistui
		}
	}
	return false; // taulukko täynnä
}

function search(&$array, $value, $m) {
	for ($i = 0; $i < $m; $i++) {
		//$j = hash_function($value, $i, $m);
		if ($array[$i] != $value) continue;

		if (!array_key_exists($i, $array)) break; // lista loppui
		if ($array[$i] != -1 && $array[$i] == $value) return $i; // löytyi, palautetaan indeksi
	}
	return false; // ei löytynyt
}

function remove(&$array, $value, $m) {
	$j = search($array, $value, $m); // haku
	if ($j < 0) throw new Exception("Error Processing Request", 1);
	else $array[$j] = -1; // vaihdetaan tilalle -1
}

function hash_function($value, $i, $m) {
	$mod = ($value % $m) + $i;
	return $mod;
}

$array = [];
$m = 10;
foreach ([21, 55, 31, 49, 52, 72, 26, 19] as $val) {
	add($array, $val, $m);
}
echo var_dump($array) . "\n";
remove($array, 21, $m);
remove($array, 55, $m);
echo var_dump($array) . "\n";
?>