题意:给定一组数据,和一个数组的长度,然后将数据插入数组中取,如果数据插入成功,则返回数据的下标,否则打印-符号
思路:首先判断其窗口值是否是一个质数,否则就找到最小的质数,然后根据hash函数算出要插入的位置,如果插入不成功,则使用二次方次探测解决冲突,如果无法插入,则打印-,第一个i=0是没有冲突,所以可以插入,直接判断i==1就可以判断是否打印空格
代码:
#include<iostream>
using namespace std;
int arr[10100],msize = 0, n;
bool isprime(int num){
if (num <= 1)return false;
for (int i = 2; i*i <= num; i++) {
if (num % i == 0)return false;
}
return true;
}
void insert(int key) {
for (int j = 0; j < msize; j++) {//插入数据
int t = (key + j * j) % msize;
if (arr[t] == 0) {//当找到了空位置打印之后就退出,否则就打印"-"
arr[t] = key;
printf("%d",t%msize);
return;
}
}
cout << "-";
}
int main() {
cin >> msize >> n;
while (isprime(msize) == false)msize++;//求出最小的素数窗口值
for (int i = 0; i < n; i++) {
int key;
scanf("%d", &key);
if (i != 0)cout << " ";//第一个一定能插入,不用打印空格
insert(key);
}
system("pause");
return 0;
}