【PAT甲级】1078 Hashing (25分)

解题过程的小记录,如有错误欢迎指出。

难度:三星(没有注意题目中解决冲突方法的提出,不过就算注意了我也不知道Quadratic probing的相关内容orz)

题目分析

给出一串数将其填入一张给出一定长度的hash表,并输出填入后的下标,如果发生冲突采用Quadratic probing解决(只找正向),如果冲突无法解决则输出’-’

注意点

  1. Quadratic probing指二次方探查法,当发生冲突时,使得newkey=num+12,newkey=num-12,newkey=num+22,newkey=num-22,newkey=num+32^……(step=1,2,3……<hash表的size:解决冲突的结束标志),直到找出不冲突的地方。本题的题干中有说明只正向找,所以只要加step的平方找,如果一直没能找到则输出’-’
  2. 1既不是素数也不是合数
  3. 解决冲突时,用二次方探查法得到的新的数也要进行求余

我的解题过程

思路

  1. 先写一个判断是否是素数的函数,然后判断给出的hash表的size是否是一个素数,如果不是则一直++到是为止
  2. 按给出的数字对size进行求余找出坐标后插入,输出坐标,若发生冲突则按照Quadratic probing的方法找是否有冲突解决点

bug

  1. 刚开始没有解决冲突问题,这样最后一个测试点过不了
  2. 后来冲突解决过程中,找到新下标后,输出的地方写错了,还是输出原来的下标

代码

#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的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

本篇要参考的话滚去看晴神代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值