Hash(散列函数)简单应用引出解决散列冲突的四种方法
商店允许顾客通过电话订购商品,并在几天后上门自取。商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的)。如何组织商店的数据库,以允许更加高效的进行插入和检索操作呢?
将纸质订单表格放在10x10的箱数组中,使用客户电话号码的后两位作为散列索引(为什么将后两位作为索引而不是前两位),将订单放到合适的箱子格中。当客户来取商品时,销售人员顺序搜索对应箱子中的所有订单——这就是利用顺序搜索来解决散列冲突的开放散列。
非哈希表特点:关键字在表中的位置和本身没有确定的关系,检索的过程将每个关键字与数据库中的关键字进行比较,查找的效率取决于比较的次数(如果为顺序组织,可以进行二分检索,时间复杂度为O(log(n));如果为非顺序组织,只能顺序检索,时间复杂度为O(n))。
哈希表的特点:关键字与他的位置有确定的关系,因此插入和检索都非常方便。关键问题:1、设计好的散列函数,使得各种可能的结果尽可能随机 2、当冲突出现时,如何解决冲突
1、开放定址法
假如多个关键字key0,key1,key2,...keys经过散列函数映射为同一地址,即产生地址冲突,那么可以为这些keyi(0<=i<=s)求得一个地址序列。
H0 = H(key0) Hi = ( H(keyi) + di ) mod m
对增量id有两种取法:1、di = 1,2,3,... (线性探测再散列) 2、 di = 1,-1,2,-2,4,-4,......k2,-k2(平方探测再散列)
2、链地址法
将哈希地址相同的元素链接在同一链表中

3、再哈希法
通过另一个哈希函数计算新的地址值,直到不冲突为止
4、建立公共溢出区
Hash(散列函数)简单应用引出解决散列冲突的四种方法的更多相关文章
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...
- Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...
- Maven 知识点总结以及解决jar报冲突的几种方法
1.常见的命令 Compile Test Package Install Deploy Clean 2.坐标的书写规范 groupId 公司或组织域名的倒序 artifactId 项目名或模块名 ve ...
- Hash算法解决冲突的四种方法
Hash算法解决冲突的方法一般有以下几种常用的解决方法 1, 开放定址法: 所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 公式为 ...
- 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决
1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...
- Python:说说字典和散列表,散列冲突的解决原理
散列表 Python 用散列表来实现 dict.散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组).在一般书中,散列表里的单元通常叫做表元(bucket).在 dict 的散列表当中,每个键 ...
- Hash冲突的四种解决办法
一.哈希表简介 非哈希表的特点:关键字在表中的位置和它自检不存在一个确定的关系,查找的过程为给定值一次和各个关系自进行比较,查找的效率取决于给定值进行比较的次数. 哈希表的特点:关键字在表中位置和它自 ...
- Java集合(九)哈希冲突及解决哈希冲突的4种方式
Java集合(九)哈希冲突及解决哈希冲突的4种方式 一.哈希冲突 (一).产生的原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致 ...
- after及before伪元素及解决父元素塌陷的几种方法
一.伪类和伪元素 CSS中伪类和伪元素有很多,也很好用!如果熟练使用的话可以解决很多问题 首先明白什么是伪类:伪类是基于当前元素的状态,而不是元素的id class等静态标志,它是动态变化的,它会在一 ...
随机推荐
- Scala数组操作
数组操作 初始化固定长度的数组 // 初始化长度为10的数组 val array = new Array[Int](10) // 初始化创建含有hello与Scala的数组 val s = Array ...
- scala (7) Set and Tuple
/** * 不可变长Set集合 */ val set0 = Set(1, 2, 3, 4, 5) //++并没有改变原有的set集合,只是将两个set进行合并形成新的set集合 val newSet0 ...
- 20155234 2006-2007-2 《Java程序设计》第4周学习总结
20155234 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 为了避免重复的行为定义使用继承. 要学会如何正确判断使用继承的时机以及继承之后如何活用多态. ...
- 学号 2016-2017-20155329《Java程序设计》课程总结
学号 2016-2017-20155329<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:想象中的师生关系 预备作业2:C语言水平调查以及认为自己最强的一项技能和毕业 ...
- 优步UBER司机全国各地最新奖励政策汇总(持续更新...)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://didi-uber.com/archiv ...
- 【转载】混编ObjectiveC++
原文:混编ObjectiveC++ 最近有点炒冷饭的嫌疑,不过确实以前没有Git Or Blog的习惯,所以很多工作上的技术分享就存留在了电脑的文档里,现在还是想重新整理一下,再分享出来. 混编C++ ...
- RHSCA模拟考试
开始考试:桌面是个黑框子 点击reboot按钮,破解密码 开机成功,输入startx进入图形界面 不能复制,要在物理机用ssh root@172.25.0.11 远程连接,就可以复制粘贴了 * Hos ...
- [SDOI2010]地精部落 DP
LG传送门 DP好题 题意很简单,就是求1-n的排列,满足一个数两边的数要么都比它大要么都比它小,求这样的排列个数对\(p\)取膜的值(为了表述简单,我们称这样的排列为波动序列). 这个题我第一眼看到 ...
- StringUtils工具类用法
/*1.字符串以prefix开始*/ StringUtils.startsWith("sssdf","");//结果是:true StringUtils.sta ...
- Spring学习(九)-----Spring bean配置继承
在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...