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是哈希表的长度。
9.9练习
解题思路:
1.四组分为两大组
2.运用字典(哈希表)记录次数
运用哈希表的心得:
1.哈希表(Hash Table)是一种非常高效的数据结构,它通过哈希函数将键(Key)映射到存储桶(Bucket)或槽(Slot)中,以实现快速的查找、插入和删除操作。
2.使用哈希表的场景:
(1)统计频率:
哈希表常用于统计元素的出现频率。 例如:给定一个字符串,统计每个字符出现的次数。
使用哈希表可以高效地处理这个任务,时间复杂度为 O(n)。
(2)快速查找:
如果你需要频繁查找数据(如在数组中查找某个元素),使用哈希表可以避免线性扫描,显著提高查找效率。 例如:给定一个数组,判断其中某个元素是否存在。遍历数组的时间复杂度是 O(n),而哈希表可以将这个查找过程优化为 O(1)。
3.总之,哈希表是一种非常强大的数据结构,它在很多情况下都能提供非常高效的性能。然而,要充分利用哈希表的优势,需要对其原理和实现细节有深入的理解,并根据具体的应用场景做出合适的设计选择。