PAT 1078. Hashing (25)

来源:互联网 发布:linux 司机售票员问题 编辑:程序博客网 时间:2024/05/01 00:01

哈希表问题,注意要点,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;}elsecout << "-";else{if(k != -1){cout << " " <<  k;a[k] = num;}elsecout << " -";}}return 0;}



0 0