图解算法读书笔记第五章

图解算法读书笔记第五章

对于一个随机列表,我们的查找操作需要一个一个的排查,算法的复杂度是 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.散列表非常适合防止重复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值