本文文末有福利,不要错过奥!
前言
假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标,那么,要查找学号为01100168的成绩的时候,只要直接访问表下标为68的数据即可。这就能够在O(1)时间复杂度内完成成绩查找。
实际上这里就用到了散列的思想。本文重在介绍散列的思想以及散列需要考虑的问题。
散列表(哈希表)
理想散列表(哈希表)是一个包含关键字的具有固定大小的数组,它能够以常数时间执行插入,删除和查找操作。
-
每个关键字被映射到0到数组大小N-1范围,并且放到合适的位置,这个映射规则就叫散列函数
-
理想情况下,两个不同的关键字映射到不同的单元,然而由于数组单元有限,关键字范围可能远超数组单元,因此就会出现两个关键字散列到同一个值得时候,这就是散列冲突
实例演示
通过前面的描述,我们已经了解了一些基本概念,现在来看一个实例。
假设有一个大小为7的表,现在,要将13,18,19,50,20散列到表中。
-
选择散列函数,例如使用hash(x)=x%7作为散列函数
-
计算数据散列值,并放到合适的位置
计算13 % 7得到6,因此将13放到下标为6的位置:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 13 |
计算18 % 7得到4,因此将18放到下标为4的位置:
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|

散列表是一种利用散列函数实现快速查找、插入和删除操作的数据结构。通过取模运算确定关键字在固定大小数组中的位置,理想情况下避免冲突。冲突解决方法包括拉链法、开放定址法(如线性探测、平方探测和双散列)以及再散列。散列表广泛应用于文件校验、数字签名和快速查询,如Redis中的字典结构。设计良好的散列表能实现近乎常数时间复杂度的操作。
941

被折叠的 条评论
为什么被折叠?



