算法笔记5----散列表

本章内容:学习散列表----最有用的基本数据结构之一。

                学习散列表的内部机制:实现,冲突和散列函数。

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,就该调整散列表的长度。

散列表可用于缓存数据,

散列表非常适合用于防止重复。


猜你喜欢

转载自blog.csdn.net/qq_41805514/article/details/80307077