php 實現hash表
阿新 • • 發佈:2018-11-28
php的陣列實際上就是hash_table,無論是 數字索引陣列array(1, 2, 3) 還是關聯陣列array(1 => 2, 2=> 4)等等。
PHP中雜湊表結構
假定向PHP陣列中插入三個元素分別為Bucket1,Bucket2,Bucket3,其中Bucket1和Bucket2的key具有相同的雜湊值。其在雜湊表中儲存如圖所示:
從上圖可知,(1)雜湊表中同一個雜湊值對應元素儲存在雙向連結串列中。(2)PHP陣列<key,value>,將key代入雜湊函式,很快獲得雜湊值。然後遍歷此雜湊值對應連結串列,獲取連結串列中某個屬性是key的節點,此節點的值是value。PHP陣列中獲取key的速率高於value,可以利用此優勢。
程式碼實現
<?php 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%12; // 返回取餘數後的值 } 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; } } 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('Bucket1','value1'); $ht->insert('Bucket2','value2'); $ht->insert('Bucket3','value3'); echo $ht->find('Bucket1'); ?>