首頁 > php教程 > PHP源码 > 主體

PHP 實作HASH表

大家讲道理
發布: 2016-11-09 14:43:05
原創
1344 人瀏覽過

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值與第一個值得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(&#39;key1&#39;,&#39;value1&#39;);
     //$ht->insert(&#39;key12&#39;,&#39;value12&#39;);
        echo $ht->find(&#39;key1&#39;);
登入後複製
🎜🎜🎜
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!