社区
数据结构与算法
帖子详情
散列表 二次探测法
chennut0802
2010-01-04 01:09:06
大家好,请问:
已知散列表的存储空间为[0..18],散列函数H(key)= key % 17,并用二次探测法处理冲突。散列表中已插入下列关键字:T[5] = 39, T[6] = 57,
T[7] = 7, 则下一个关键字23插入的位置是什么呢?我查看参考答案是T[10],但是不知道为什么。自己算出来是
[H(key)+ i * i ] % m = [H(23)+ 8 * 8 ] % 19 = 4.请大家指点一下。谢谢!
...全文
706
10
打赏
收藏
散列表 二次探测法
大家好,请问: 已知散列表的存储空间为[0..18],散列函数H(key)= key % 17,并用二次探测法处理冲突。散列表中已插入下列关键字:T[5] = 39, T[6] = 57, T[7] = 7, 则下一个关键字23插入的位置是什么呢?我查看参考答案是T[10],但是不知道为什么。自己算出来是 [H(key)+ i * i ] % m = [H(23)+ 8 * 8 ] % 19 = 4.请大家指点一下。谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chennut0802
2010-01-06
打赏
举报
回复
但是我在另一本书本——徐孝凯的《数据结构》看到:i的取值范围是(0<=i<=m-1),d=h(K),di=(di-1 + 2i -1)%m,似乎和deniselee看到的书不一样?
另外donkey301说:二次探测法中的增量i = 1*1, -1*1, 2*2, -2*2, ...似乎又有出入了?
请问大家,究竟二次探测法中的增量有没有一个准确的定义呢?
yorkzjy
2010-01-06
打赏
举报
回复
既然是hash table,就建议不要用二次探测了,用链式存储效果更好。
donkey301
2010-01-06
打赏
举报
回复
[Quote=引用 8 楼 chennut0802 的回复:]
但是我在另一本书本——徐孝凯的《数据结构》看到:i的取值范围是(0 <=i <=m-1),d=h(K),di=(di-1 + 2i -1)%m,似乎和deniselee看到的书不一样?
另外donkey301说:二次探测法中的增量i = 1*1, -1*1, 2*2, -2*2, ...似乎又有出入了?
请问大家,究竟二次探测法中的增量有没有一个准确的定义呢?
[/Quote]
我猜di=(di-1 + 2i -1)%m这个表达式应该为
d[i]=(d[i-1] + 2i -1)%m吧,其中d[i]表示i时的增量。
如果不考虑%m,那么d[i]=d[i-1] + 2i -1就是一个数列,初始项d[0] = 0,它的通项式就是d[i] = i*i
也就是d[i] = 1*1, 2*2, 3*3, 4*4, ....
徐孝凯写成d[i]=(d[i-1] + 2i -1)%m应该是觉得这样计算更快一点吧。
我写的d[i] = 1*1, -1*1, 2*2, -2*2, ...
是从下面这个网页看到的:
http://www.coood.com/postfile/2006-12-31/20061231174649.shtml
我觉得这两种方式用来做增量都能做hash表中解决冲突,你在hash表操作的时候只要知道你用的是那一种就行了。
deniselee
2010-01-05
打赏
举报
回复
[Quote=引用 4 楼 chennut0802 的回复:]
谢谢大家的指点,请问公式[H(key)+ i * i ] % m中m是不是存储空间为的长度19呢?
[/Quote]
m不是空间长度,此处是17,
i的取值范围是1..n/2,n为空间长度。
书上是这么写的,不过我不大清楚为什么
deniselee
2010-01-05
打赏
举报
回复
我是这么算的:
T= (H(23) +1)/17 = 7.(该位已有元素)
T= (H(23) -1*1)/17 = 6.(该位已有元素)
T= (H(23) +2*2)/17 =10.(该位无元素,可插入)
于是得到位置是 10
chennut0802
2010-01-04
打赏
举报
回复
谢谢大家的指点,请问公式[H(key)+ i * i ] % m中m是不是存储空间为的长度19呢?
pmars
2010-01-04
打赏
举报
回复
对不起,写错了:
应该是:
H(key) % m + i * i = H(23) % 17 + 2 * 2 = 10.
前提是 1*1 和 -1*1 都算过了!
pmars
2010-01-04
打赏
举报
回复
[Quote=引用 1 楼 donkey301 的回复:]
二次探测法中的增量i = 1*1, -1*1, 2*2, -2*2, ...我不明白你的i=8*8是怎么来的。你可以对比一下线形探测,当第j位非空时,应该探测j+1位是否为空。
[/Quote]
顶一下!
楼主的算法应该变为:H(key) % m + i * i = H(23) % 17 + 8 * 8 = 4.
谨代表个人意见!
donkey301
2010-01-04
打赏
举报
回复
二次探测法中的增量i = 1*1, -1*1, 2*2, -2*2, ...我不明白你的i=8*8是怎么来的。你可以对比一下线形探测,当第j位非空时,应该探测j+1位是否为空。
二次
探测
发解决冲突的闭
散列表
二次
探测
发解决闭
散列表
中的冲突问题,可供参考
散列表
(哈希表,线性
探测
再散列)
散列表
,也称为哈希表。根据设定的哈希函数H(key)和处理冲突的方
法
将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置的表。 哈希函数的构造方
法
:1)直接定地址
法
2)数字分析
法
3)平方取中
法
4)折叠
法
5)除留余数
法
6)随机数
法
处理冲突的方
法
:1)开放定址
法
(线性
探测
再散列,
二次
探测
再散列,伪随机
探测
再散列) 2)再哈希
法
3)链地址
法
4)建立一 公共溢出区
cpp代码-
二次
探测
再散列哈希表
cpp代码-
二次
探测
再散列哈希表
选取哈西函数h(k)=k%11,用线性
探测
在散列方
法
处理冲突。是
选取哈西函数h(k)=k%11,用线性
探测
在散列方
法
处理冲突。是在0-10的散列地址中,对关键序列(22,41,53,46,30,01,67)构造哈希表并求等概率情 况下查找成功与不成功过的平均查找长度
哈希(散列)查找1
1、散列函数的设计 2、冲突的处理 1、直接地址
法
2、除留余数
法
3、数字分析
法
4、平方取中
法
1、线性
探测
法
3、随机
探测
法
2、
二次
探测
法
4、拉链
法
:
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章