散列表 二次探测法

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 打赏 收藏 转发到动态 举报
写回复
用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位是否为空。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧