PAT甲级刷题之路——A1078 Hashing

PAT甲级A1078

  • 题如其名,哈希表题
    • PAT甲级A1078 Hashing(25分)
      • 原题如下
      • 题目意思
      • 自己的想法
      • 答案反馈
      • 代码
      • 结语

题如其名,哈希表题

嘿嘿,既然是哈希表,那我用 m a p map map吧, S T L STL STL爸爸我永远爱你!!
后来发现根本不需要用map,其实一个数组就能搞定了,大概这道题是考察质数的吧~

关键词:质数 哈希表

PAT甲级A1078 Hashing(25分)

原题如下

PAT甲级刷题之路——A1078 Hashing_第1张图片
PAT甲级刷题之路——A1078 Hashing_第2张图片

题目意思

向哈希表中插入整数,哈希函数定义为:
H ( k e y ) = k e y % T S i z e H(key)=key\%TSize H(key)=key%TSize
如果表的大小不是质数,需要重新定义表的大小,使表的大小为大于原来表的大小的最小质数。
输入:
M M M:定义的表的大小 N N N:输入数的数量
N N N个离散的整数
输出:
输出输入整数的在哈希表中的位置(从0开始),如果不能插入则输出’-’。

自己的想法

  1. 判断表的大小 M M M是否为质数,若否,则重新找到满足条件的质数。
  2. 根据哈希函数定义将数插入map,若该位置已经插入了数,则输出’-’。

答案反馈

花了大概15分钟,最后一个测试点没过orz,静下心想想想
PAT甲级刷题之路——A1078 Hashing_第3张图片
重点在这:使用只向正向增加的二次方探查法
Quadratic probing (with positive increments only) is used to solve the collisions.
一开始这句话没仔细看,因为不确定里面的 Q u a d r a t i c Quadratic Quadratic的意思
具体的哈希表的各种解决冲突的方法如以下传送门:
构造哈希表之二次探查法
PAT甲级刷题之路——A1078 Hashing_第4张图片

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 100000;
bool flag[maxn] = { false };
//map Hash;
bool is_prime(int k) {
	if (k == 1)return false;
	for (int i = 2; i <= int(sqrt(1.0*k)); i++) {
		if (k%i == 0)return false;
	}
	return true;
}
int main() {
	int m, n;
	cin >> m >> n;
	//判断表的大小是否为质数,若不是则重新定义
	if (!is_prime(m)) {
		for (int i = m + 1;; i++) {
			if (is_prime(i)) {
				m = i; break;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (i != 0)cout << ' ';
		int temp;
		cin >> temp;
		int hash = temp % m;
		if (flag[hash] == false) {
			flag[hash] = true;
			cout << hash;
		}
		else {
			int fg = 0;
			for (int i = 0;i<m; i++) {
				int t = (hash + int(pow(1.0*i, 2.0)))%m;
				if (t >= m)break;
				if (flag[t] == false) {
					fg = 1; flag[t] = true;
					cout << t; break;
				}
			}
			if (fg == 0)cout << '-';
		}
	}
	cout << endl;
	return 0;
}

结语

认真审题!深刻理解解决哈希冲突的方法!

你可能感兴趣的:(PAT甲级刷题之路)