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新手上路(十一)
Oct 09 PHP
PHP执行速率优化技巧小结
Mar 15 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
phpmyadmin中禁止外网使用的方法
Nov 04 PHP
php类的定义与继承用法实例
Jul 07 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
一段实用的php验证码函数
May 19 PHP
微信支付扫码支付php版
Jul 22 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
Swoole实现异步投递task任务案例详解
Apr 02 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP Cookie学习笔记
2016/08/23 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue实现购物车加减
2020/05/30 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
团委竞选演讲稿
2014/04/24 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
导游词之广西漓江
2019/11/02 职场文书