PAT-A-1078 Hashing (25 分) 哈希表二次探测再散列 C++题解

该博客详细介绍了PAT-A-1078题目的解题过程,主要涉及哈希表的二次探测再散列方法。博主首先解释了题目的大意,即在哈希表中存储长度为n的数组,如果哈希表长度M不是素数,则扩大到下一个素数。由于冲突解决策略是二次探测再散列,博主在实现过程中遇到了问题,但在查阅资料后理解了这种方法,即在发生冲突时,检查(key±i^2)%M是否为空,找到空位存放key。博客最后提供了通过所有测试用例的AC代码。
摘要由CSDN通过智能技术生成

1078 Hashing (25 分)

题目传送门:1078 Hashing (25 分)

一、题目大意

将给定长度为n的数组放到长度为M的哈希表中,如果M不是素数,则将M往后扩大到M后面的第一个素数。
在哈希时如果冲突,则二次探测再散列。刚开始没注意这一句:Quadratic probing (with positive increments only) is used to solve the collisions.,以至于最后一组数据一直过不了。
在这里插入图片描述

二、解题思路

将M扩增到大于等于的M的最小素数不难,难点是不知道什么是哈希表二次探测再散列,我百度后才知道,其实就是当将key往哈希表中存的时候,当发现key%M这一位已经存放了别的数了,那再放key就会产生冲突,那么我们该怎么解决冲突呢,就是二次探测,就是依次看(key±i^2)%M是否存放数,i是从1到M-1,如果遇到一个未存放数的哈希位置,我们就把key放到放到(key±i^2)%M这个位置上即可。

三、AC代码

#include<bits/stdc++.h>
using namespace std;
vector<int>P{
   2};
void init(int n){
   //滚动数组产生素数表
	for(int i = P.back()+1; i <= n; i+=2){
   
		bool f = true;
		for(auto j: P){
   
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值