PAT甲级1078 hashing

深碍√TFBOYSˉ_ 2023-07-24 13:13 149阅读 0赞

题目大意:
利用除留余数法建hashtable,然后利用平方探查法缓解hash值冲突问题,然后要你输出每个输入的值在hashtable中的下标位置,如果不存在的话输出 -
解题思路:
1.当给的表长msize不为素数时,需要先求出比msize大的最小的素数
2.如果temp%msize的位置已经有元素,那么对H(key)+k*k位置进行查找,如果H(key)+k *k大于msize,则取模msize。若没找到合适的位置则递增k,当k在【0,msize)范围内都没有找到一个合适的位置的话,那么temp无法插入hashtable,输出-
注意:
大于10000的最小素数为止,所以在利用素数筛选法的时候尽量把数组开大一点
代码:

  1. #include<cstdio>
  2. #include<vector>
  3. using namespace std;
  4. int main()
  5. {
  6. int msize,n;
  7. scanf("%d%d",&msize,&n);
  8. int isprime[10099];//1表示是素数,不够的话增加范围,适用最后一个测试案例
  9. for(int i=0;i<10099;i++)isprime[i]=1;
  10. isprime[1]=0;
  11. for(int i=2;i<6000;i++)//素数筛查法
  12. {
  13. if(isprime[i]==1)
  14. {
  15. for(int j=i*2;j<10099;j+=i)isprime[j]=0;
  16. }
  17. }
  18. while(isprime[msize]!=1)msize++;
  19. vector<int> v(msize,-1),output(n);
  20. for(int i=0;i<n;i++)
  21. {
  22. int temp,k=0;
  23. bool flag=false;
  24. scanf("%d",&temp);
  25. while(k<msize)
  26. {
  27. int index=temp+k*k;
  28. if(index>=msize)index=index%msize;//判定条件很关键
  29. if(v[index]==-1)//未被占用
  30. {
  31. output[i]=index;
  32. v[index]=temp;
  33. flag=true;
  34. break;
  35. }
  36. else k++;
  37. }
  38. if(!flag)output[i]=-1;
  39. }
  40. printf("%d",output[0]);
  41. for(int i=1;i<n;i++)
  42. {
  43. if(output[i]!=-1)printf(" %d",output[i]);
  44. else printf(" -");
  45. }
  46. return 0;
  47. }

发表评论

表情:
评论列表 (有 0 条评论,149人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PAT甲级1078 hashing

    题目大意: 利用除留余数法建hashtable,然后利用平方探查法缓解hash值冲突问题,然后要你输出每个输入的值在hashtable中的下标位置,如果不存在的话输出 -

    相关 PAT A1078

    ![clipboard.png][] 这道题牵扯到了hash散列中的集中查询方式,随后做一个总结,对于素数方面,没有神马难度; include<iostream>