图解算法读书笔记第五章
对于一个随机列表,我们的查找操作需要一个一个的排查,算法的复杂度是 O O O( n n n),随着列表程度的增加,所用的时间也是线性增加的。
但对于一个有顺序的列表,我们可以使用二分查找去做,这样的算法复杂度为 O O O( l o g n logn logn),相比较而言,时间的减少了很多。
对于这一点,我们需要有一个函数能将输入的值做某种映射,将一个输入的任意的值转化为一个唯一确定的标识,这样就可以使用有序数列的二分查找去做处理了。
散列函数正好可以实现这样的功能,不论你输入什么,它都可以给你返回一个数字,这个数字就是他的一个标识,或者说地址。但散列函数不是完全的能区分不同的输入,即可能出现对输入对应的标识是一样的,这时就出现了冲突,比较常用的方法是在重复的地方建一个链表。
最好的情况时一个输入对应一个输出(函数关系),最坏的情况是所有输入对应一个输出。如果所有输入对应一个输出,那个查找的时间复杂度就又变成了 O ( l o g n ) O(logn) O(logn),这样起不到时间散列表的作用。
为此我们引入填装因子去衡量散列表发生冲突的可能
填
装
因
子
=
散
列
表
包
含
元
素
/
位
置
总
数
填装因子=散列表包含元素/位置总数
填装因子=散列表包含元素/位置总数
填充因子越大,那么冲突的概率就越高,需要适当增加位置总数。这里作者介绍了一个经验:
一旦填充因子大于0.7,就调整散列表的长度
小结:
1.散列表是一种功能强大的数据结构,其操作速度快,还能让你以不同的方式建立数据模型、
2.你可以结合散列函数与数组来创建散列表
3.散列表的查找、插入、删除速度都非常快
4.散列表适合用于模拟映射关系
5.一旦填充因子超过0.7,就调整散列表的长度
6.散列表可以用于缓冲数据
7.散列表非常适合防止重复