解题过程的小记录,如有错误欢迎指出。
难度:三星(没有注意题目中解决冲突方法的提出,不过就算注意了我也不知道Quadratic probing的相关内容orz)
题目分析
给出一串数将其填入一张给出一定长度的hash表,并输出填入后的下标,如果发生冲突采用Quadratic probing解决(只找正向),如果冲突无法解决则输出’-’
注意点
- Quadratic probing指二次方探查法,当发生冲突时,使得newkey=num+12,newkey=num-12,newkey=num+22,newkey=num-22,newkey=num+32^……(step=1,2,3……<hash表的size:解决冲突的结束标志),直到找出不冲突的地方。本题的题干中有说明只正向找,所以只要加step的平方找,如果一直没能找到则输出’-’
- 1既不是素数也不是合数
- 解决冲突时,用二次方探查法得到的新的数也要进行求余
我的解题过程
思路
- 先写一个判断是否是素数的函数,然后判断给出的hash表的size是否是一个素数,如果不是则一直++到是为止
- 按给出的数字对size进行求余找出坐标后插入,输出坐标,若发生冲突则按照Quadratic probing的方法找是否有冲突解决点
bug
- 刚开始没有解决冲突问题,这样最后一个测试点过不了
- 后来冲突解决过程中,找到新下标后,输出的地方写错了,还是输出原来的下标
代码
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
int s = (int)sqrt(num*1.0);
for (int i = 2; i <= s; i++){
if (num%i == 0) return false;
}
return true;
}
int main()
{
int msize, n;
cin >> msize >> n;
while (!isPrime(msize)) msize++;
vector<int> hashTable(msize, -1);
for (int i = 0; i < n; i++) {
if (i != 0) printf(" ");
int num;
scanf("%d", &num);
if (hashTable[num%msize] == -1|| hashTable[num%msize] == num) {
hashTable[num%msize] = num;
printf("%d", num%msize);
}
else {
int j = 1;
for (j; j <= msize; j++) {
int newnum = num + j*j;
if (hashTable[newnum%msize] == -1 || hashTable[newnum%msize] == num) {
hashTable[newnum%msize] = num;
printf("%d", newnum%msize);// 原来把这里写成num%msize了,这样就还是原来的冲突结果
break;
}
}
if (j > msize) printf("-");
}
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
本篇要参考的话滚去看晴神代码