一、7-1哈希(30分)
这个问题的任务很简单:将一系列不同的正整数插入到哈希表中,并输出输入数字的位置。
散列函数被定义为H(密钥)=密钥%TSize,其中TSize是散列表的最大大小。
二次探测(仅具有正增量)用于解决冲突。
请注意,表格大小最好是素数。
如果用户给出的最大大小不是素数,则必须将表大小重新定义为最大素数,该素数大于用户给定的大小。
输入规格:
每个输入文件包含一个测试用例。
对于每种情况,第一行包含两个正数:MSize(≤104)和N(≤MSize),它们分别是用户定义的表大小和输入数。
然后在下一行给出N个不同的正整数。
一行中的所有数字都用空格分隔。
输出规格:
对于每个测试用例,在一行中打印输入数字的相应位置(索引从0开始)。
一行中的所有数字都用空格分隔,并且行的末尾不能有额外的空格。
如果无法插入号码,请打印“ - ”。
样本输入:
4 4
10 6 4 15
样本输出:
0 1 4 -
1、判断一个数是不是素数
bool if_prime(int a) { int i; //定义参数 if(a==1||a==0)return false; //如果a为1或0,不是素数返回flase for(i=2;i<=sqrt(a);i++) //sqrt()平方根函数(??//记得加#include <math.h> { if(a%i==0)return false; //a不为素数,返回flase } return true; //a为素数,返回true }
2、 得到一个大于等于a的最小素数
int get_prime(int a) { while(!if_prime(a)) //当a不为素数 { a++; //a值+1 } return a; //返回a }
3、主函数
int main() { int m,n; //定义参数 cin>>m>>n; //输入表长与输入个数 m=get_prime(m); //表长定义为大于等于m的最小素数 int visited[10007]={0}; //定义访问数组并全置0 int input[n]; //定义输入数组 int i,j,k; //定义参数 for(i=0;i<n;i++) { cin>>input[i]; //输入正整数序列 } for(i=0;i<n;i++) { j=input[i]%m; //得到应插入的位置值 if(visited[j]==0) //若该位置未被插入 { cout<<j; //输出该位置值 if(i<n-1)cout<<" "; //判断是否输出空格 visited[j]=1; //表示该位置已被插入 } else //若该位置已被插入 { for(k=1;k<m;k++) { j=(k*k+input[i])%m; //采用二次方探查法处理冲突 if(visited[j]==0) //若处理后的位置未被插入 { cout<<j; //输出位置值 if(i<n-1)cout<<" "; //判断是否输出空格 visited[j]=1; //表示该位置已被插入 break; //跳出循环 } } if(k==m) //若k=m,则无法插入 { cout<<"-"; //输出'-' if(i<n-1)cout<<" "; //判断是否输出空格 } } } return 0; }
二、目标:
1)复习前面学的章节
2)认真学习下一章节并及时复习并完成作业,提前做好预习