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实现将GB编码转换为UTF8
Nov 25 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
php插件Xajax使用方法详解
Aug 31 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP反射学习入门示例
Jun 14 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 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使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
限制文本字节数js代码
2007/03/06 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
flexigrid 参数说明
2010/11/23 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
python调用fortran模块
2016/04/08 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
南京南京观后感
2015/06/02 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python