基础实验5-2.1 整型关键字的平方探测法散列 (25分)
首先题目有说明表的大小要是大于等于所给表长的最小素数,表长求不好会影响之后的检测位置
输入格式:
首先第一行给出两个正整数 MSize(≤104)和 N(≤MSize),分别对应输入的表长和输入数字的个数。随后第二行给出 N 个不重复的正整数,数字间以空格分隔。
输出格式:
在一行中按照输入的顺序给出每个数字在散列表中的位置(下标从 0 开始)。如果某个数字无法插入,就在其位置上输出 -。输出间以 1 个空格分隔,行首尾不得有多余空格。
代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <set>
using namespace std;
set<int>q;
typedef struct TblNode *HashTable;
struct TblNode{
int TableSize;
int *Data;
};
int NextPrime(int T){
if(T==1) //1不是素数
return T+1;
if (T<4)
return T;
else {
T = T % 2 ? T : T + 1;
int i;
while (true) {
for (i = sqrt(T); i > 2; --i)
if (T % i == 0)
break;
if (i != 2)T += 2;
else return T;
}
}
}
int HashFind(HashTable HT,int x){
q.clear();
int pos=x%HT->TableSize;
int temp=pos;
int size=0;
int i=1;
while (true) {
if(HT->Data[pos]==-1){
HT->Data[pos]=x;
return pos;
}
else {
q.insert(pos);
if (q.size()==size) //如果查找的位置一直在循环就说明找不到
return -1;
size=q.size();
pos =(temp + i * i)%HT->TableSize;
}
i++;
}
}
int main() {
int TableSize,N;
cin>>TableSize>>N;
int p;
TableSize=NextPrime(TableSize);
HashTable HT;
HT=(HashTable)malloc(sizeof(struct TblNode));
HT->TableSize=TableSize;
HT->Data=(int *)malloc(sizeof(int)*HT->TableSize);
for (int i = 0; i < HT->TableSize; ++i)
HT->Data[i]=-1;
while (N--){
cin>>p;
p=HashFind(HT,p);
if(p!=-1)
cout<<p;
else
cout<<"-";
if (N>0)
cout<<' ';
}
return 0;
}