ハッシュ テーブル (ハッシュ テーブルとも呼ばれる) は、キーワード Key を配列内の位置にマッピングすることでレコードにアクセスします。
ハッシュ関数の機能は、任意の長さの入力を変換することです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 つの要素が挿入されると、HASH 値が競合する可能性があります。 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('key1','value1'); //$ht->insert('key12','value12'); echo $ht->find('key1');