考查散列表的二次探测再散列
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool isPrime(int n){
if(n <= 1) return false;
for(int i = 2; i*i <= n; ++i){
if(n%i == 0) return false;
}
return true;
}
int main(){
int msize, n;
scanf("%d%d", &msize, &n);
while(!isPrime(msize)) ++msize;
vector<bool> used(msize, false);
for(int i = 0; i < n; ++i){
int key, h;
scanf("%d", &key);
h = key%msize;
if(i) printf(" ");
if(used[h]){
int i;
for(i = 0; i < msize; ++i){
if(!used[(key+i*i)%msize]){
used[(key+i*i)%msize] = true;
printf("%d", (key+i*i)%msize);
break;
}
}
if(i == msize) printf("-");
}
else{
used[h] = true;
printf("%d", h);
}
}
return 0;
}
本文介绍了一个基于散列表的二次探测再散列算法实现。该算法通过使用二次探测来解决散列表中的冲突问题,并确保即使在散列表中存在冲突的情况下也能找到合适的存储位置。代码实现了散列表的构建过程,包括散列函数、二次探测处理冲突的方法等。
1991

被折叠的 条评论
为什么被折叠?



