11-散列2 Hashing (25 分)

本文探讨了平方探测法在散列表中的应用,重点分析了如何选择合适的素数大小以避免冲突,以及在实现过程中的常见误区。通过具体代码示例,详细解释了寻找下一个素数的正确方法,以及如何正确实施平方探测策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//平方探测法出现挑来挑去找不到位置的情况
#include <iostream>
#include <cmath>
#define MaxTableSize 100000
const int maxn = 10001;
using namespace std;
typedef struct HTable *Hashtable;
struct HTable {
	int *list;
	int size;
};

bool isPrime(int m) {
	if (m <= 1)return false;
	int sqr = (int)sqrt(1.0*m);
	for (int i = 2; i <= sqr; i++)
	{
		if (m%i == 0) return false;
	}
	return true;
}
int nextPrime(int m) {
	if (!isPrime(m)) {
		//最开始没有考虑用户可能输入1  照抄的陈姥姥寻早下一个素数的代码 不对
		if (m == 1 || m % 2 == 0) //1不是素数
			m++;
		while (m<MaxTableSize)
		{
			int i;
			for (i = (int)sqrt(m); i > 2; i--)
				if (m%i == 0)break;
			if (i == 2)break;
			else m += 2;//对奇数判断 是否为素数
		}
		return m;
	}
}




Hashtable creatHash(int size) {
	Hashtable H;
	H = new struct HTable;
	H->size = nextPrime(size);
	H->list = new int [H->size];
	for (int i = 0; i < H->size; i++)
	{
		H->list[i] = 0;
	}
	return H;
}


int Insert(Hashtable H, int x) {
	int pos = x % H->size;
	int temp = pos;
	int i=0;
	for (i = 0; i < H->size && H->list[pos]; i++)
	{		
		
		pos = temp + pow((i+1),2);
		pos = pos % H->size;
	}
	if (i == H->size) {
		pos = -1;
	}
	H->list[pos] = 1;
	return pos;
}



int main() {
	int m, n;
	int t;
	int pos[maxn];
	cin >> m >> n;
	Hashtable H = creatHash(m);
	for (int i = 0; i < n; i++)
	{
		cin >> t;
		pos[i] = Insert(H,t); //第几个元素所在的位置
	}
	cout << pos[0];
	for (int i = 1; i < n; i++) {
		if (pos[i] == -1) {
			cout << " -";
		}
		else {
			cout << " " << pos[i];
		}
		
	}
	system("pause");
	return 0;
}

陷入的点有三个:
1.寻找下个素数,照着上一道题的代码复制了一遍,显示报错;问题在于,没有考虑用户输入为1 ,既不是素数,还是奇数。
2.这道题的平方探测法仅仅使用正向遍历,不用考虑负向的,才开始没注意。
3.平方探测法是在原位置的基础上进行跳跃遍历找空,不是找完一个位置不行再在该位置的基础上平方。(现在想想也是…不过写代码的时候比较懵)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值