php 实现Hash表功能实例详解


Posted in PHP onNovember 29, 2016

php 实现Hash表功能

Hash表作为最重要的数据结构之一,也叫做散列表。使用PHP实现Hash表的功能。PHP可以模拟实现Hash表的增删改查。通过对key的映射到数组中的一个位置来访问。映射函数叫做Hash函数,存放记录的数组称为Hash表。

Hash函数把任意长度的和类型的key转换成固定长度输出。不同的key可能拥有相同的hash。
Hash表的时间复杂度为O(1)

<?php
class HashTable{
  private $arr = array();
  private $size = 10;
  public function __construct(){
    //SplFixedArray创建的数组比一般的Array()效率更高,因为更接近C的数组。创建时需要指定尺寸
    $this->arr = new SplFixedArray($this->size);
  }
  /**
   * Description: 简单hash算法。输入key,输出hash后的整数
   * @param $key
   * @return int
   */
  private function simpleHash($key){
    $len = strlen($key);
    //key中每个字符所对应的ASCII的值
    $asciiTotal = 0;
    for($i=0; $i<$len; $i++){
      $asciiTotal += ord($key[$i]);
    }
    return $asciiTotal % $this->size;
  }
  /**
   * Description: 赋值
   * @param $key
   * @param $value
   * @return bool
   */
  public function set($key, $value){
    $hash = $this->simpleHash($key);
    $this->arr[$hash] = $value;
    return true;
  }
  /**
   * Description: 取值
   * @param $key
   * @return mixed
   */
  public function get($key){
    $hash = $this->simpleHash($key);
    return $this->arr[$hash];
  }
  public function getList(){
    return $this->arr;
  }
  public function editSize($size){
    $this->size = $size;
    $this->arr->setSize($size);
  }
}
?>

 下面对我们的HashTable进行测试。

<?php
//测试1
$arr = new HashTable();
for($i=0; $i<15; $i++){
  $arr->set('key'.$i, 'value'.$i);
}
print_r($arr->getList());

//测试2
$arr->editSize(15);
for($i=0; $i<15; $i++){
  $arr->set('key'.$i, 'value'.$i);
}
print_r($arr->getList());
?>

 改变了值之后可以存放更多的元素。但是仍然存在不同的key可能产生相同的hash值,那么赋值的时候后操作会覆盖前操作的问题。这种冲突的问题我们来用拉链法解决。

拉链法解决冲突。拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表。如果不能理解我的文字,请看下面的示例,看一下打印信息就明白了。拉链法是什么,就是链表。

创建一个HashNode类,用来存储key和value的值,并且存储相同hash的另一个元素。在同一条链上,查找越后的元素越费时。时间复杂度为O(n).

<?php
class HashNode{
  public $key;
  public $value;
  public $nextNode;
  public function __construct($key, $value, $nextNode=Null){
    $this->key = $key;
    $this->value = $value;
    $this->nextNode = $nextNode;
  }
}
class NewHashTable{
  private $arr;
  private $size = 10;
  public function __construct(){
    $this->arr = new SplFixedArray($this->size);
  }
  private function simpleHash($key){
    $asciiTotal = 0;
    $len = strlen($key);
    for($i=0; $i<$len; $i++){
      $asciiTotal += ord($key[$i]);
    }
    return $asciiTotal % $this->size;
  }
  public function set($key, $value){
    $hash = $this->simpleHash($key);
    if(isset($this->arr[$hash])){
      $newNode = new HashNode($key, $value, $this->arr[$hash]);
    }else{
      $newNode = new HashNode($key, $value, null);
    }
    $this->arr[$hash] = $newNode;
    return true;
  }
  public function get($key){
    $hash = $this->simpleHash($key);
    $current = $this->arr[$hash];
    while(!empty($current)){
      if($current->key == $key){
        return $current->value;
      }
      $current = $current->nextNode;
    }
    return NULL;
  }
  public function getList(){
    return $this->arr;
  }
}
?>

对我们新的HashTable进行测试

<?php
//测试1
$newArr = new NewHashTable();
for($i=0; $i<30; $i++){
  $newArr->set('key'.$i, 'value'.$i);
}
print_r($newArr->getList());
var_dump($newArr->get('key3'));
?>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP 超链接 抓取实现代码
Jun 29 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
php 大数据量及海量数据处理算法总结
May 07 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP register_shutdown_function()函数的使用示例
Jun 23 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
php文件上传 你真的掌握了吗
Nov 28 #PHP
php微信公众号js-sdk开发应用
Nov 28 #PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 #PHP
php微信公众平台交互与接口详解
Nov 28 #PHP
php微信公众号开发模式详解
Nov 28 #PHP
jQuery+php简单实现全选删除的方法
Nov 28 #PHP
PHP中的use关键字及文件的加载详解
Nov 28 #PHP
You might like
PHP记录页面停留时间的方法
2016/03/30 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
Jquery练习之表单验证实现代码
2010/12/14 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
python中xrange用法分析
2015/04/15 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
Python变量类型知识点总结
2019/02/18 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
python脚本定时发送邮件
2020/12/22 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
应届毕业生就业自荐信
2013/10/26 职场文书
打架检讨书300字
2014/02/02 职场文书
优秀护士获奖感言
2014/02/20 职场文书
校庆标语集锦
2014/06/25 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
工作粗心大意检讨书
2014/09/18 职场文书