二十一、数据结构之散列(哈希表) - 分离链接法,开放定值法,再散列

      针对于Hash表其实就是将键值经过一系列计算(Horner运算法则,不懂得请自行百度),在规定大小(可进行再散列,这里只是做讲解)的散列表中进行存储,散列表的长度一般为素数(具体原因个人也没理解,但如果用非素数,那需要进行散列的key将集中在与之本身Mod值为0的数)。而对于进行通过Hash算法得到的值也许会有冲突,这种情况并且经常发生,所以下面讲解解决冲突的两种方法,对于哈希表本身的实现并不难,重点是解决冲突和装填因子的比例问题。

       1、分离连接法:  简单点说,其实就是声明出一个链表数组,对于进行冲突的值(比如:我们假设数组长度为10,而进行Hash计算的公式为:X mod 10,所以29和39他俩都会存储在数组下标为9的位置上,这是就会有冲突,所以我们就用链表的方法来对他进行并列存储),下面是代码实现,看代码就可以理解了,这里只做思想讲解。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义存储值的类型
typedef char * ElemType;

//定义链表存储结构
typedef struct ListNode
{
	ElemType data;
	struct ListNode *next;
}ListNode, *Position;
typedef Position List;

//定义哈希表存储结构
typedef struct HashNode
{
	int size;
	List *theList;
}HashNode, *HashTable;

//获取下一个质数
int NextPrime(int size)
{
	while(true)
	{
		if(size % 2 == 0 || size % 3 == 0)
		{
			size++;
		}
		else
		{
			return si
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值