书籍推荐
《大话数据结构》——https://www.geekschool.club/book/detail/20006
散列
散列又称为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
- 负载因子
负 载 因 子 a = 散 列 表 中 已 有 的 数 据 项 散 列 表 中 基 础 存 储 区 能 容 纳 的 数 据 项 负载因子a = \frac {散列表中已有的数据项}{散列表中基础存储区能容纳的数据项} 负载因子a=散列表中基础存储区能容纳的数据项散列表中已有的数据项
-
常用散列函数
- 数学分析法
- 折叠法
- 中平方和法
- 除余法
- 基数转换法
-
冲突消解技术
冲突消解技术从实现上可分为内消解法和外消解法。
- 内消解法:
内消解的基本方法称为开地址法,其基本思想是插入数据并发现冲突是,设法在基本存储区为需要插入的数据另行安排一个位置。于是设计了一种叫计算位置安排方式——探查方式。
常用的探查方式有线性探查和双散列探查。
1.线性探查:
D
=
0
,
1
,
2
,
3
,
4
⋅
⋅
⋅
D=0, 1, 2, 3, 4···
D=0,1,2,3,4⋅⋅⋅
2.双散列探查:
d
i
=
i
∗
h
2
(
k
e
y
)
d_i=i*h_2(key)
di=i∗h2(key)
- 外消解法:
外消解法一半需要借助外部存储区间解决冲突,重用的方法有溢出区法和桶散列法。
- 溢出区法:
当插入关键码的散列位置没有数据时就直接插入,发生冲突时将相应数据和关键码一起顺序存入溢出区。对应检索和删除也是先找散列位置,如果数据与关键码不匹配,则去溢出区顺序检索,直到找到或检索完。
- 桶散列法(拉链法):
散列表的每个元素只是一个引用域,饮用者一个保存实际数据的存储桶。拉链法中一个存储桶就是一个连表的头节点