本章内容:学习散列表----最有用的基本数据结构之一。
学习散列表的内部机制:实现,冲突和散列函数。
5.1散列函数
散列函数是这样的函数,即无论你给它什么数据,它都还你一个数字。
要求:散列表必须是一致的。
它将不同的输入映射到不同的数字。
散列函数总是将同样的输入映射到相同的索引。同样的将不同的输入映射的不同的索引,各个数字都只有唯一对应的输入值。
散列函数知道数组有多大,只返回有效的索引,超出范围的值无效。
Python提供的散列表即字典
>>> book = {} >>> book['apple'] = 0.67 >>> book['like'] = 3 >>> book['love'] = 6 >>> print book {'love': 6, 'apple': 0.67, 'like': 3}
5.2应用案例
5.2.1将散列表用于查找
>>> phone_book = dict() >>> phone_book['loli'] = 378237 >>> phone_book['police'] = 110 >>> print phone_book['loli'] 378237
电话号码都对应唯一的一个键,通过键来查找对应映射的值。
5.2.2防止重复
v = {} def vt(name): if v.get(name): print 'get out' else: v[name] = True print('come') vt('loli') vt('loli')
散列表能让你快速知道来投票的人是否投过票
5.2.3将散列表用作缓存
缓存的工作原理:网站将数据记住,而不是重新计算。
缓存的优点:用户能更快的看到网页。网站需要做的工作更少
缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中。
5.2.4小结
散列表适用于:模拟映射关系,防止重复,缓存数据
5.3冲突
冲突:给两个键分配的位置相同。
散列函数很重要。最理想的情况是:散列函数将键均匀的映射到散列表的不同位置。
5.4性能
在平均情况下,散列表执行各种操作的时间都为O(1)。O(1)被称为常量时间,就是说不管散列表有多大,所需的时间都是相同的。
在最糟情况下,散列表所有操作的运行时间都为O(n)----线性时间。
要避免冲突,需要有:较低的填装因子,良好的散列函数。
5.4.1填装因子
填装因子=已占用的位置/位置总数
当填装因子开始增大,就需要在散列表中添加位置,也就是调整长度。通常将散列表增加一倍。
5.5小结
你可以结合散列函数和数组来创建散列表。
冲突很糟糕,你应使用可以最大限度减少冲突的散列函数。
散列表的查找,插入和删除速度特别快。
散列表适合用于模拟映射关系。
一旦填装因子超过0.7,就该调整散列表的长度。
散列表可用于缓存数据,
散列表非常适合用于防止重复。