散列查找--解决冲突的方法

常用的处理冲突的方法:开放定址法,分离链接法。

因为是期末复习(●ˇ∀ˇ●),浅浅地记个开放定址法的线性探测法和平方探测法;

例:

设关键字序列{47,7,29,11,9,84,54,20,30},散列表表长TableSize=13,散列函数为:h(key)=key mod 11。

萌新瞎补:

散列表表长:对于一串数,就看做一个整形数组来存这些数,TableSize就是数组的大小;

散列函数:咳咳,这是之前的知识啊!就是本来是这个数,通过一种关系变成了另外一个数,比如为了实现离散化操作。

ok,继续。

线性探测法:

见表:

关键字4772911984542030
散列地址3770971098
冲突次数001003136

可见啊,有些关键字对应的散列地址有冲突!

线性 探测 上

所谓线性,就是对于原冲突散列地址+1再往散列函数搞搞,h(new)=(h(old)+1)%13,其实很显然就是往他右边看看,如果右边没有就在右边住下了,如果右边还有持续往右,但是注意,最右边的时候,本来式子就是取膜啊,所以就是往回看起,就是这么一步一步的探测,找空位子。

平均查找长度(ASL):就是一共找了几次然后除以关键字的个数。比如:上面的例子:ASL=(1+1+2+1+1+4+2+4+7)/9≈2.56;

平方探测法:

这个据说比线性好,我们能在线性探测法看到,如果连续一段都已经被占了,那么线性的话(也就是+1的话)有点慢啊。
这个时候,平方 探测  出场。
线性不是每次+1取膜么?平方就是如果“聚集”,我是加一个数k的平方,而且这个k会越来越大,而且线性只往右边(其实是往右的循环),平方是往两端,具体序列是:
+1^2,-1^2,+2^2,-2^2,+3^2,-3^2,...,+k^2,-k^2  这样的话找的更快啊!
有证据(略)表明:TableSize如果是4x+3(x是正整数)形式的素数,平方探测法就可以探查到整个散列表空间;
有一题譬如:PAT1078
题目是严格向右探测的:
贴一小段代码,当找不到的时候,注意+k^2 并取膜;
bool flag=false;
			int inc=1;
			while(inc<Size)
			{
				int tmp=(x+inc*inc)%Size;
				if(mp.find(tmp)==mp.end())
				{
					mp[tmp]=1;
					a[i]=tmp;
					flag=true;
					break;
				}
				inc++;
			}
			if(!flag) a[i]=-1;

OK,THAT'S ALL;



转载于:https://www.cnblogs.com/keyboarder-zsq/p/6777480.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值