0
点赞
收藏
分享

微信扫一扫

【1078】Hashing&素数

E_topia 2022-07-14 阅读 27


文章目录

  • ​​1.题目​​
  • ​​2.思路​​
  • ​​3.代码​​
  • ​​4.相关复习​​

1.题目

​​https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592​​ 给出散列表长TSize和欲插入的元素,将这些元素按读入的顺序插入散列表中,其中散列函数为H(key)=key%TSize,解决冲突采用只往正向增加的二次方探查法。如果TSize不是素数,则将TSize重新赋值为第一个比TSize大的素数再进行元素插入。

2.思路

散列函数H(key)=key%TSize,解决冲突使用二次方探查法。
如果步长step从0~TSize-1枚举仍然无法找到位置,则step≥TSize也不可能找到位置了
注意:
(1)在解决冲突时找到位置后一定一定一定要中断该循环(break)!!
(2)别sb忘记要找大于等于Tsize的最小素数作为表长。

3.代码

#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
const int N=11111;
bool hashtable[N]={0};
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 Tsize,num,a;
cin>>Tsize>>num;
while(isPrime(Tsize)==0){
Tsize++;
}
for(int i=0;i<num;i++){
cin>>a;
int M=a%Tsize;
if(hashtable[M]==false){//表示M号位还未被使用
hashtable[M]=true;
if(i==0)
printf("%d",M);
else
printf(" %d",M);
}else{//开始用二次探寻处理冲突
int step=1;
for(step=1;step<Tsize;step++){
M=(a+step*step)%Tsize;
if(hashtable[M]==false){//表示M号位还未被使用则找到空位
hashtable[M]=true;
if(i==0)
printf("%d",M);
else
printf(" %d",M);
break;//找了就一定跳出for循环了!!
}
}
if(step>=Tsize){//找不到插入的地方
if(i>0)
printf(" ");
printf("-");
}
}
}
system("pause");
}

4.相关复习

打印素数表:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
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 prime[101],pNum=0;
bool p[101]={0};
void Find_Prime(){//求素数表
for(int i=1;i<101;i++){
if(isPrime(i)==true){
prime[pNum++]=i;
p[i]=true;
}
}
}
int main(){
Find_Prime();
for(int i=0;i<pNum;i++)
printf("%d ",prime[i]);
system("pause");
}

(1)1不是素数;
(2)素数表长至少要比n大1;
(3)在Find_Prime()函数中特别留意i<maxn不能写成i≤maxn。
(4)main函数中记得调用Find_Prime(),不然是不会出结果的。


举报

相关推荐

0 条评论