31-除留余数法(开地址法)的有关函数

知识点:

1.链地址法要优于开地址法

2.最重要的是插入和查找

3.链地址法和开地址法都属于除留余数法

4.除留余数法作散列函数优于其他函数

5.分布越均匀,哈希冲突越小,速度越快,开地址法和链地址法的时间复杂度为O(1)

6.哈希表是基于数组的一种存储方式.它主要由哈希函数和数组构成。当要存储一个数据的时候,首先用一个函数计算数据的地址,然后再将数据存进指定地址位置的数组里面。这个函数就是哈希函数,而这个数组就是哈希表。

哈希表的优势在于:相比于简单的数组以及链表,它能够根据元素本身在第一时间,也就是时间复杂度为0(1)内找到该元素的位置。这使得它在查询和删除、插入上会比数组和链表要快很多。因为他们的时间复杂度为o(n)。

哈希冲突是指哈希函数算出来的地址被别的元素占用了,也就是,这个位置有人了。好的哈希函数会尽量避免哈希冲突。而解决哈希冲突的办法之一就是开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法。

哈希函数用的就是链地址法,也就是数组+链表的方法,hashMap用的就是链地址法.。链地址法就是,当没有发生哈希冲突的时候hashmap主要只有数组。但是当发生冲突的时候,它会在哈希函数找到的当前数组内存地址位置下添加一条链表。

结构体:

#define m  16//哈希表的长度
#define  p   13//除留余数法的除数,一般是比m小的最大素数,H(key)=key%p   p <= m
#define NONE -1//当前哈希表为空

#include <stdio.h>

typedef struct Hash
{
   
	int key;//关键字
	//InfoType otherinfo//其他数据项
}Hash,HashTable[m];

1.哈希函数

//哈希函数:除留余数法
static int H(int key)
{
   
	return key % p;
}

2.初始化哈希表

void  InitHashTable(HashTable ht)
{
   
	for (int i = 0; i < m; i++)
	{
   
		ht[i].key = NONE;
	}
}

初始化哈希表测试:

	//初始化测试:
	HashTable ht;
	InitHashTable
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值