PAT 1078. Hashing (25)

哈希表问题,注意要点,1不是prime,最小的prime number是2.

二次探测即,hi = (h(x) + i^2) % Msize,0 <= i <= m-1;

下面的方法用了等式:i^2 = (i - 1)^2 + 2*i - 1,来用加法替代乘法。

代码如下:

#include <iostream>

using namespace std;

int a[10001];
int findPos(int x,int Msize)
{
	int offset = 1;
	int currentPos = x % Msize;

	bool flag = false;
	while(a[currentPos] != -1 && a[currentPos] != x)   
	{
		currentPos += offset;
		offset += 2;
		if(currentPos >= Msize)
			currentPos -= Msize;

		if(offset > (2*Msize - 3))
		{
			flag = true;
			break;
		}
	}

	if(flag)
		return -1;

	return currentPos;
}

bool isPrime(int x)
{
	if(x == 1)
		return false;
	for(int i = 2;i<=x/2;i++)
		if(x % i == 0)
			return false;

	return true;
}

int findMsize(int x)
{

	while(!isPrime(x))
	{
			x= x + 1;		 
	}
	return x;
}

int main()
{
	int Msize,N;
	cin >> Msize >> N;

	Msize = findMsize(Msize);

	int i;

	for(i = 0;i<Msize;i++)
		a[i] = -1;
	for(i = 0;i<N;i++)
	{
		int num;
		cin >> num;
		int k = findPos(num,Msize);
		
		if(i == 0)
			if(k != -1){
				cout <<  k;
				a[k] = num;
			}
			else
				cout << "-";
		else
		{
			if(k != -1){
				cout << " " <<  k;
				a[k] = num;
			}
			else
				cout << " -";
		}
	}

	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值