【数据结构 | C++】整型关键字的平方探测法散列

整型关键字的平方探测法散列

将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)=key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)+i^2)解决冲突。

注意散列表的表长最好是个素数。如果输入给定的表长不是素数,你必须将表长重新定义为大于给定表长的最小素数。

输入格式:

首先第一行给出两个正整数 MSize(≤10^4)和 N(≤MSize),分别对应输入的表长和输入数字的个数。随后第二行给出 N 个不重复的正整数,数字间以空格分隔。

输出格式:

在一行中按照输入的顺序给出每个数字在散列表中的位置(下标从 0 开始)。如果某个数字无法插入,就在其位置上输出 -。输出间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

4 4

10 6 4 15
输出样例:

0 1 4 -

c 复制代码
#include<bits/stdc++.h>
using namespace std;
#define SIZE 10001
bool isprime(int n)
{
	for (int i = 2; i <= n / 2; i++)
	{
		if (n % i == 0) return false;
	}
	return true;
}
int main()
{
	vector<int> v;
	int MSize, N;
	cin >> MSize >> N;
	if (MSize == 1)
	{
		MSize = 2;
	}
	while (!isprime(MSize))
	{
		MSize++;
	}
	int* a = new int[MSize];
	fill(a, a + MSize, 0);  //数组初始化为0
	int elem,pos,cpos;
	int k = 1;
	bool flag=false;
	for (int i = 0; i < N; i++)
	{
		 k = 1;
		 flag = false;
		cin >> elem;
		pos = elem % MSize;
		if (a[pos] == 0)  //该位置可插入
		{
			v.push_back(pos);
			a[pos] = 1;
		}
		else
		{
			cpos = pos;
			while (a[pos] != 0)
			{
				pos = (cpos + k * k) % MSize;
				++k;
				if (pos==cpos)   //没有找到插入位置
				{
					flag = true;
					break;
				}
			}
			if (flag == true) v.push_back(-101);
			else
			{
				v.push_back(pos);
				a[pos] = 1;
			}
		}
	}
	for (int i = 0; i < v.size(); i++)
	{
		if (v[i] == -101) cout << "-";
		else cout << v[i];
		if (i != v.size() - 1) cout << " ";
	}
	delete[]a;
	return 0;
}
相关推荐
Jac_kie_層樓1 天前
力扣hot100刷题记录(12.2)
算法·leetcode·职场和发展
雍凉明月夜1 天前
c++ 精学笔记记录Ⅰ
开发语言·c++·笔记
小鹏编程1 天前
C++ 周期问题 - 计算n天后星期几
开发语言·c++
繁华似锦respect1 天前
C++ unordered_map 底层实现与详细使用指南
linux·开发语言·c++·网络协议·设计模式·哈希算法·散列表
稚辉君.MCA_P8_Java1 天前
Gemini永久会员 C++返回最长有效子串长度
开发语言·数据结构·c++·后端·算法
京东零售技术1 天前
下一代 Lakehouse 智能未来新引擎 | Apache Hudi Meetup亚洲站活动回顾
算法
京东零售技术1 天前
NeurIPS 2025 | TANDEM:基于双层优化的数据配比学习方法
后端·算法
ULTRA??1 天前
Qt 数据类型体系(AI总结)
c++·qt
zmzb01031 天前
C++课后习题训练记录Day42
开发语言·c++·算法
CoovallyAIHub1 天前
MAR-YOLOv9:革新农业检测,YOLOv9的“低调”逆袭
深度学习·算法·计算机视觉