哈希表问题,注意要点,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;
}