PHP如何实现高效哈希表?
- 内容介绍
- 文章标签
- 相关推荐
本文共计478个文字,预计阅读时间需要2分钟。
Hash表又称散列表,通过关键字Key映射到数组中的一个位置来访问记录。Hash函数的作用是将任意长度的输入(键值)通过算法转换成固定长度的输出(哈希值)。该过程包括将输入转换为固定长度的输出,以便在数据结构中快速定位数据。Hash表的时间复杂度通常较低。
Hash 表又称散列表,通过关键字Key 映射到数组中一个位置来访问记录
Hash 函数的作用是把任意长度的输入,通过HASH算法变换成固定长度的输出,该输出就是HASH值
HASH表的时间复杂度为O(1)
下文使用直接取余法实现
创建一个hashtable
classHashTable{ private$buckets; //用于存储数据的数组 private$size=12; //记录buckets数组的大小 publicfunction__construct(){ $this->buckets=newSplFixedArray($this->size); //SplFixedArray效率更高,也可以用一般的数组来代替 } privatefunctionhashfunc($key){ $strlen=strlen($key); //返回字符串的长度 $hashval=0; for($i=0;$i<$strlen;$i++){ $hashval+=ord($key[$i]);//返回ASCII的值 } return$hashval%$this->size;//返回取余数后的值 } publicfunctioninsert($key,$value){ $index=$this->hashfunc($key); if(isset($this->buckets[$index])){ $newNode=newHashNode($key,$value,$this->buckets[$index]); }else{ $newNode=newHashNode($key,$value,null); } $this->buckets[$index]=$newNode; } publicfunctionfind($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; } returnNULL; } }
上述可能会有冲突问题,比如HASH表指向的
插入两个元素,第二个元素的HASH值与第一个值得HASH值相同
则第二个元素将覆盖第一个元素的值
这时我们用拉链法解决冲突:具有相同HASH值得字节点链接在同一个链表中。查找这个元素的时候就必须遍历这条链表。
创建 HASHNODE
classHashNode{ public$key; //关键字 public$value; //数据 public$nextNode; //HASHNODE来存储信息 publicfunction__construct($key,$value,$nextNode=NULL){ $this->key=$key; $this->value=$value; $this->nextNode=$nextNode; } }
实现
$ht=newHashTable(); $ht->insert('key1','value1'); //$ht->insert('key12','value12'); echo$ht->find('key1');
本文共计478个文字,预计阅读时间需要2分钟。
Hash表又称散列表,通过关键字Key映射到数组中的一个位置来访问记录。Hash函数的作用是将任意长度的输入(键值)通过算法转换成固定长度的输出(哈希值)。该过程包括将输入转换为固定长度的输出,以便在数据结构中快速定位数据。Hash表的时间复杂度通常较低。
Hash 表又称散列表,通过关键字Key 映射到数组中一个位置来访问记录
Hash 函数的作用是把任意长度的输入,通过HASH算法变换成固定长度的输出,该输出就是HASH值
HASH表的时间复杂度为O(1)
下文使用直接取余法实现
创建一个hashtable
classHashTable{ private$buckets; //用于存储数据的数组 private$size=12; //记录buckets数组的大小 publicfunction__construct(){ $this->buckets=newSplFixedArray($this->size); //SplFixedArray效率更高,也可以用一般的数组来代替 } privatefunctionhashfunc($key){ $strlen=strlen($key); //返回字符串的长度 $hashval=0; for($i=0;$i<$strlen;$i++){ $hashval+=ord($key[$i]);//返回ASCII的值 } return$hashval%$this->size;//返回取余数后的值 } publicfunctioninsert($key,$value){ $index=$this->hashfunc($key); if(isset($this->buckets[$index])){ $newNode=newHashNode($key,$value,$this->buckets[$index]); }else{ $newNode=newHashNode($key,$value,null); } $this->buckets[$index]=$newNode; } publicfunctionfind($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; } returnNULL; } }
上述可能会有冲突问题,比如HASH表指向的
插入两个元素,第二个元素的HASH值与第一个值得HASH值相同
则第二个元素将覆盖第一个元素的值
这时我们用拉链法解决冲突:具有相同HASH值得字节点链接在同一个链表中。查找这个元素的时候就必须遍历这条链表。
创建 HASHNODE
classHashNode{ public$key; //关键字 public$value; //数据 public$nextNode; //HASHNODE来存储信息 publicfunction__construct($key,$value,$nextNode=NULL){ $this->key=$key; $this->value=$value; $this->nextNode=$nextNode; } }
实现
$ht=newHashTable(); $ht->insert('key1','value1'); //$ht->insert('key12','value12'); echo$ht->find('key1');

