数据结构9.6-9.9练习

                                  9.6练习

哈希表的基本知识

1.哈希表(Hash Table)又称散列表,是除顺序存储结构、链式存储结构和索引表存储结构之外的又一种存储结构。 

2.哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素

一般哈希表都是用来快速判断一个元素是否出现集合里。

3.哈希函数构造

哈希函数构造

目标

使得到的哈希地址尽可能均匀地分布在n个连续内存单元地址上。使计算过程尽可能简单以达到尽可能高的时间效率。

方法

直接定址法:取关键字的某个线性函数值为哈希地址,这类函数是一一对应的函数,不会产生冲突,但要求地址集合与关键字集合大小相同,因此,对于较大的关键字集合不适用H(key)=a*key+b (a,b为常数)

数字分析法:提取关键字中取值较均匀的数字位作为哈希地址的方法。它适合于所有关键字值都已知的情况。

除留余数法:设哈希表长度为m,选择一个不大于m的数p,让关键字对p取余(mod运算),得到的就是哈希地址:H(key)=key % p

使用除留余数法,选取合适的p很重要,p一般选取质数。

4.哈希碰撞:

解决办法

1.拉链法:把具有相同哈希地址的记录放在同

一个单链表中,称为同义词链表。若有m个

哈希地址,则有m个单链表,并用数组来存

放各个链表的头指针,凡是哈希地址相同的

记录都被以结点方式插入到对应的头结点的

单链表中。

哈希碰撞:

解决办法

2.开放定址法:是一类以发生冲突的哈希地址为自变量,通过某种哈希冲突函数得到一个新的空闲的哈希地址的方法。 

(1)线性探测法

从发生冲突的地址(设为d)开始,依次探测d 的下一个地址(当到达下标为m-1的哈希表表尾时,下一个探测的地址是表首地址0),直到找到一个空闲单元为止。

       d0=H(key)

       d=( d +1) % m(1≤i≤m-1) 

(2)二次探测法

       d0=H(key)

       di=(d0±i2) % m(1≤i≤m-1)

       其中,d0是发生冲突的地址,m是哈希表的长度。

6a8884df6a6841f0b41cd773ab411aa3.png

313568befdb948da8a1ab62465157c97.png 

c52fb5449a4646d0b983dfca24398993.png 

0e85f8ef590443508b746cbefd500345.png 

92fad5b8a04e41c5b545e9f57f673bf3.png 

04e1b0206c4e460386606c452562183e.png 

                                   9.9练习

5b1d0865cc974408af45c9d52532ccc0.png

94132c7b83034431a4c83b0c4bd8f8f9.png 

6385f41e5ddd4adfbc57a66b59800cb2.png 

617d6db0753143d7b3bc5bce7a945d61.png 

0833f57f9b92468abed8b2bac68a417c.png 

759be5e1cf0549238d762bf38dee5612.png 

75e3d80ca03c43e3901f6866dc8f7cfa.png 

29fd47b3d35f4cf9b50c655de469b553.png 

018966b62c544aecae6e42b2fdaa4f86.png 

 解题思路:

1.四组分为两大组

2.运用字典(哈希表)记录次数

运用哈希表的心得:

1.哈希表(Hash Table)是一种非常高效的数据结构,它通过哈希函数将键(Key)映射到存储桶(Bucket)或槽(Slot)中,以实现快速的查找、插入和删除操作。

2.使用哈希表的场景:

(1)统计频率:

哈希表常用于统计元素的出现频率。 例如:给定一个字符串,统计每个字符出现的次数。

使用哈希表可以高效地处理这个任务,时间复杂度为 O(n)。

(2)快速查找:

如果你需要频繁查找数据(如在数组中查找某个元素),使用哈希表可以避免线性扫描,显著提高查找效率。 例如:给定一个数组,判断其中某个元素是否存在。遍历数组的时间复杂度是 O(n),而哈希表可以将这个查找过程优化为 O(1)。

3.总之,哈希表是一种非常强大的数据结构,它在很多情况下都能提供非常高效的性能。然而,要充分利用哈希表的优势,需要对其原理和实现细节有深入的理解,并根据具体的应用场景做出合适的设计选择。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值