本文操作系统:windows7系统、PHP5.6版本、DELL G3电脑。
1.内部组成
键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。
槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。
哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。
2.优势
通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有的数据量,一个实现良好的哈希表依旧可以保持O(1)的查找速度,而O(n)的普通列表此时已经无法正常执行查找操作(实际上不可能,受到JVM可用内存限制,机器内存限制等)。
3.应用场景
在工程上,经常用于通过名称指定配置信息、通过关键字传递参数、建立对象与对象的映射关系等。目前最流行的NoSql数据库之一Redis,整体的使用了哈希表思想。
一言以蔽之,所有使用了键值对的地方,都运用到了哈希表思想。
4.使用实例
<?php classhashTable { private$collection; private$size=100; //初始化哈希表的大小 publicfunction__construct($size='') { $bucketsSize=is_int($size)?$size:$this->size; $this->collection=newSplFixedArray($bucketsSize); } //生成散列值,作为存储数据的位置 privatefunction_hashAlgorithm($key) { $length=strlen($key); $hashValue=0; for($i=0;$i<$length;$i++){ $hashValue+=ord($key[$i]); } return($hashValue%($this->size)); } //在相应的位置存储对应的值 publicfunctionset($key,$val) { $index=$this->_hashAlgorithm($key); $this->collection[$index]=$val; } //根据键生成散列值,进而找到对应的值 publicfunctionget($key) { $index=$this->_hashAlgorithm($key); return$this->collection[$index]; } //删除某个值,成功返回1,失败返回0 publicfunctiondel($key) { $index=$this->_hashAlgorithm($key); if(isset($this->collection[$index])){ unset($this->collection[$index]); return1; }else{ return0; } } //判断某个值是否存在,存在返回1,不存在返回0 publicfunctionexist($key) { $index=$this->_hashAlgorithm($key); if($this->collection[$index]){ return1; }else{ return0; } } //返回key的个数 publicfunctionsize() { $size=0; $length=count($this->collection); for($i=0;$i<$length;$i++){ if($this->collection[$i]){ $size++; } } return$size; } //返回value的序列 publicfunctionval() { $size=0; $length=count($this->collection); for($i=0;$i<$length;$i++){ if($this->collection[$i]){ echo$this->collection[$i]."<br/>"; } } } //排序输出 publicfunctionsort($type=1) { $length=count($this->collection); $temp=array(); for($i=0;$i<$length;$i++){ if($this->collection[$i]){ $temp[]=$this->collection[$i]; } } switch($type){ case1: //正常比较 sort($temp,SORT_REGULAR); break; case2: //按照数字比较 sort($temp,SORT_NUMERIC); break; //按照字符串进行比较 case3: sort($temp,SORT_STRING); break; //根据本地字符编码环境进行比较 case4: sort($temp,SORT_LOCALE_STRING); break; } echo"<pre>"; print_r($temp); } //逆序输出 publicfunctionrev($type=1) { $length=count($this->collection); $temp=array(); for($i=0;$i<$length;$i++){ if($this->collection[$i]){ $temp[]=$this->collection[$i]; } } switch($type){ case1: //正常比较 rsort($temp,SORT_REGULAR); break; case2: //按照数字比较 rsort($temp,SORT_NUMERIC); break; //按照字符串进行比较 case3: rsort($temp,SORT_STRING); break; //根据本地字符编码环境进行比较 case4: rsort($temp,SORT_LOCALE_STRING); break; } echo"<pre>"; print_r($temp); } } //简单的测试 $list=newhashTable(200); $list->set("zero","zerocompare"); $list->set("one","firsttest"); $list->set("two","secondtest"); $list->set("three","threetest"); $list->set("four","fouthtest"); echo$list->val(); echo"aftersorted:<br/>"; $list->rev(3);原文来自:https://www.py.cn
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容