散列表

将散列表用作缓存

①缓存是一种常用的加速方式,缓存的数据存储在散列表中
②当访问facebook页面时,它首先检查散列表中是否存储了该页面,具体代码如下:

cache={}
def get_page(url):
	if cache.get(url):
		return cache[url]
	else:
		data=get_data_from_serve(url)
		cache[url] = data
		return data

仅当url不在缓存中,服务器才做处理,并且将处理生成的数据存储到缓存中,再返回它。下次再有人请求url,可以直接发送缓存中的数据,服务器不用处理了。

小结

散列表适合用于
①模拟映射关系
②防止重复
③缓存/记住数据,以免服务器再通过处理来生成它们

冲突

①给两个键分配的位置相同是冲突,处理冲突最简单的办法:如果两个键映射到了同一个位置,就在这个位置存储一个链表。
②如果这个链表很短,也没什么大不了,在特殊情况下,可能一个位置包含一个很长的链表,这样很糟糕,散列表的速度会很慢
③经验教训:
1、散列表很很重要。最理想的情况,散列表将键均匀地映射到散列表的不同位置。
2、如果散列表的链表很长,散列表的速度急剧下降,如何选择好的散列函数呢?

性能

①平均情况下,散列表执行各种操作的时间都为O(1),O(1)为常量时间,不是马上的意思,而是不管散列表多大,所需的时间都相同。在平均情况下,散列表确实很快,在最糟的情况下,散列表所有操作的运行时间都为O(n),很慢。
②比较数组和链表,平均情况下,散列表的查找速度与数组一样快,而插入和删除的速度与链表一样快,具有两者的优点
③但是最糟糕情况下,散列表的速度都很慢,因此要避开最糟情况,就要避免冲突,而要避免冲突,需要有:
1、较低的填装因子
2、良好的散列函数

填装因子

①散列表的填装因子很容易计算:
散列表包含的元素数/位置总数
②散列表的位置满了,填装因子为1,如果少了一半位置,填充因子为2。
一旦填装因子开始增大,就要在散列表中添加位置,是调整长度。

小结

①可以结合散列函数和数组来创建散列表
②使用最大限度减少冲突的散列函数
③散列表适合模拟映射关系
④散列表用于缓存数据
⑤散列表非常适合用于防止重复

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值