博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hash表学习笔记
阅读量:4665 次
发布时间:2019-06-09

本文共 1481 字,大约阅读时间需要 4 分钟。

 
一、hash表的基本概念和优缺点比较
      hash表又称哈希表 ,是一种数据结构,与链表、二叉树有很大区别。
1、hash表优缺点
优点:能够在常数级的时间复杂度上进行查找,并且插入数据和删除数据简单。(Hash未满的时候速度很快)
缺点:不支持排序,一般比用线性表存储需要更多时间,并且记录的关键字不能重复
2、与链表比较
链表:查询上表中的数据从头开始遍历,直到查到或者查找失败。
hash:根据存储数据特定关键字,然后根据关键字直接查询想要得到数据。
hash存储位置通常称作Hash地址。
Hash地址是由关键字经过特定的 hash函数运算得到。
3、当关键字重复就会产生数据冲突。
二、hash表的构造方法
1、直接定址法
例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。
           但这种方法效率不高,时间复杂度是O(1),空间复杂度是O(n),n是关键字的个数
          eg:f(x) = 5x+10
            x代表的就是年龄,而f(x)获取到的就是对应地址,是取Hash地址与关键字构成的线性函数。
2、平方取中法
适用关键字是数字的情况,将关键字平方然后取其中间的几位作为Hash地址。
3、数字分析法
比如同龄人的出生年月,由于前几位数字的重复几率较大,所以造成冲突的几率较高,所以尽量不取前几位。
4、折叠法
将关键字分割成相同的几段数字(最后一部分可以不同),然后将得到的几段数字叠加(进位舍去)作为Hash地址,折叠法
eg:每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,
如果一本书的编号为1234-5678-321,可以将其分为{12,34,56,78,32,1}。而Hash地址则是这几个数之和。
5、除留取余法
如果知道Hash表的最大长度为m,可以取不大于m的最大质数p,
然后对关键字进行取余运算,f(x) = x%p。
在这里p的选取非常关键,p选择的好的话,能够最大程度地减少冲突,
p一般取不大于m的最大质数。
6、随机数法
选择一个随机函数,取关键字的随机函数值为它的哈希地址,即
f(x)=random(x) ,其中random为随机函数。通常用于关键字长度不等时采用此法。
三、冲突处理
1、开放定址法
关键字冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,
当碰到一个空的单元时,则插入其中。
eg:一组关键字{13,25,23,38,34,6,84,91},
Hash表长为14,Hash函数为f(x)=x%11,当插入13,25时可以直接插入,而当插入23时,地址1被占用了,
因此沿着地址1依次往下探测(探测步长可以根据情况而定),直到探测到地址3,发现为空,则将23插入其中。
2、再哈希法
当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
3、链地址法
采用数组和链表结合的方式,HashMap中就是采用这种方式存储Hash地址,原理是将Hash地址(经过关键字计算的值)相同的记录存在同一个链表中,
而每张表的表头序号就是新的Hash地址。
4、建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。
 
 
 
 
参考博文:
 
 
 
 

转载于:https://www.cnblogs.com/freedom-yuxin/p/7454605.html

你可能感兴趣的文章
带参装饰器,迭代器与生成器
查看>>
sprint2第五天任务完成情况
查看>>
如何进行Apache虚拟机设置
查看>>
【水滴石穿】报错解决不了
查看>>
Qt之Tab键实现(自由切换焦点)
查看>>
Codeforces 920F. SUM and REPLACE / bzoj 3211 花神游历各国
查看>>
Cocos2d-x 3.2 学习笔记(七)Scene And Transition
查看>>
Re:JavaScript
查看>>
ajax 200 4 parseerror的一个问题
查看>>
面试题之实现系统函数系列一:实现memmove函数
查看>>
数据结构:可持久化并查集
查看>>
基于UDP协议的Socket通信
查看>>
linux安装配置Redis,Swoole扩展
查看>>
C语言-02基本运算
查看>>
轻巧快速的JSON工具--fastJSON
查看>>
生男生女预测软件,千人验证无误
查看>>
js call()和apply()方法的区别和用法详解
查看>>
Android之Service
查看>>
HDU 2795 Billboard 解题报告
查看>>
多线程——newCachedThreadPool线程池
查看>>