Home  >  Article  >  Backend Development  >  PHP 实现HASH表

PHP 实现HASH表

WBOY
WBOYOriginal
2016-06-20 12:45:061065browse

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');


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn