1145 Hashing - Average Search Time
#include <iostream>
#include <iomanip>
#define MAXSIZE 10007 // nextPrime(10000)
using namespace std;
bool isPrime( int num ) {
if( num == 1 ) return false; // 这里注意要判断1!
for( int i = 2; i * i <= num; i++ )
if( num % i == 0 ) return false;
return true;
}
int nextPrime( int num ) {
int i;
for( i = num; !isPrime(i); i++ );
return i;
}
void QuadraticProbing( int hashTab[], int MSize, int num ) {
int pos, key = num % MSize;
for( int i = 0; i <= MSize; i++ ) {
pos = (key + i*i) % MSize;
if( hashTab[pos] == 0 ) {
hashTab[pos] = num;
return;
}
}
cout << num << " cannot be inserted." << endl;
}
int calQP( int hashTab[], int MSize, int num ) {
int pos, i, key = num % MSize;
for( i = 0; i < MSize; i++ ) {
pos = (key + i*i) % MSize;
if( hashTab[pos] == num || hashTab[pos] == 0 ) // 找到对应数字或探测到空位!!
break;
}
return i + 1;
}
int main() {
int MSize, N, M, num, searchTime = 0;
int hashTab[MAXSIZE];
cin >> MSize >> N >> M;
MSize = nextPrime(MSize);
for( int i = 0; i < MSize; i++ )
hashTab[i] = 0; // 初始化
for( int i = 0; i < N; i++ ) {
cin >> num;
QuadraticProbing( hashTab, MSize, num );
}
for( int i = 0; i < M; i++ ) {
cin >> num;
searchTime += calQP( hashTab, MSize, num );
}
cout << fixed << setprecision(1) << (double)searchTime / M;
}
几点需要注意
- 查数时,通过平方探测法探测到相同数字和空位时,查数结束,后者表示找不到该数
- 此处平方探测法“边界”是MSize-1
- 格式控制