哈希表在php中的使用

本文操作系统: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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容