ホームページ >php教程 >PHP源码 >PHPはHASHテーブルを実装します

PHPはHASHテーブルを実装します

大家讲道理
大家讲道理オリジナル
2016-11-09 14:43:051392ブラウズ

ハッシュ テーブルは、ハッシュ テーブルとも呼ばれます。キーは、レコードにアクセスするために配列内の位置にマップされます。

ハッシュ関数の機能は、HASH アルゴリズムを通じて任意の長さの入力を固定長の出力に変換することです。出力は HASH 値です

HASH テーブルの時間計算量は O(1) です

以下は直接剰余メソッドを使用して実装します

ハッシュテーブルを作成します

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 テーブルが指す 2 つの要素、2 番目の要素の HASH 値が最初の HASH 値と同じである場合、2 番目の要素は最初の要素の値を上書きします。このとき、ジッパー メソッドを使用して解決します。競合: 同じ 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;);

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。