PHP 實現HASH表

jopen 9年前發布 | 842 次閱讀 PHP

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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!