PHP 實現HASH表
Hash 表又稱散列表,通過關鍵字Key 映射到數組中一個位置來訪問記錄
Hash 函數的作用是把任意長度的輸入,通過HASH算法變換成固定長度的輸出,該輸出就是HASH值
HASH表的時間復雜度為O(1)
下文使用直接取余法實現
創建一個hashtable
class HashTable{
private $buckets; //用于存儲數據的數組
private $size = 12; //記錄buckets 數組的大小
public function __construct(){
$this->buckets = new SplFixedArray($this->size);
//SplFixedArray效率更高,也可以用一般的數組來代替
}
private function hashfunc($key){
$strlen = strlen($key); //返回字符串的長度
$hashval = 0;
for($i = 0; $i<$strlen ; $i++){
$hashval +=ord($key[$i]); //返回ASCII的值
}
return $hashval%$this->size; // 返回取余數后的值
}
public function insert($key,$value){
$index = $this->hashfunc($key);
if(isset($this->buckets[$index])){
$newNode = new HashNode($key,$value,$this->buckets[$index]);
}else{
$newNode = new HashNode($key,$value,null);
}
$this->buckets[$index] = $newNode;
}
public function find($key){
$index = $this->hashfunc($key);
$current = $this->buckets[$index];
echo "</br>";
var_dump($current);
while(isset($current)){ //遍歷當前鏈表
if($current->key==$key){ //比較當前結點關鍵字
return $current->value;
}
$current = $current->nextNode;
//return $current->value;
}
return NULL;
}
}
上述可能會有沖突問題,比如HASH表指向的
插入兩個元素,第二個元素的HASH值與第一個值得HASH值相同
則第二個元素將覆蓋第一個元素的值
這時我們用拉鏈法解決沖突:具有相同HASH值得字節點鏈接在同一個鏈表中。查找這個元素的時候就必須遍歷這條鏈表。
創建 HASHNODE
class HashNode{
public $key; //關鍵字
public $value; //數據
public $nextNode; //HASHNODE來存儲信息
public function __construct($key,$value,$nextNode = NULL){
$this->key = $key;
$this->value = $value;
$this->nextNode = $nextNode;
}
}
實現
$ht = new HashTable();
$ht->insert('key1','value1');
//$ht->insert('key12','value12');
echo $ht->find('key1');
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!