本文文末有福利,不要错过奥!
前言
假设你们班级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 |
---|