算法图解 (五)

第五章 散列表

本章开头作者用一个雇员的例子, 引出了散列表的好处. 字典就是散列表

  • 散列函数总是将同样的输入映射到相同的索引
  • 散列函数将不同的输入映射到不同的索引
  • 散列函数知道数组有多大,只返回有效的索引

总结一下就是跟字典的键值对形式一样, 键是唯一的, 值是键对应的值。

这章中还提到了缓存的概念, 让我想到了之前看的慕课网视频里面讲到的装饰器缓存的例子, 觉得太神奇了, 还能这么玩!

# coding: utf-8
"""
斐波那契数列: 又称黄金分割数列,
指得是这样一个数列, 1, 1, 2, 3, 5, 8...,
这个数列从第三项开始, 每一项都等于前两项之和。 求数列第n项
"""
# 我们很容易就可以写出这么一个递归函数
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)


li = fibonacci(5)
print(li)


# 改进一
def fibonacci(n, cache=None):
    if cache is None:
        cache = {}
    if n in cache:
        return cache[n]
    if n <= 1:
        return n
    cache[n] = fibonacci(n - 1, cache) + fibonacci(n - 2, cache)
    return cache[n]

print(fibonacci(100))


# 改进二
def memo(func):
    cache = {}
    def wrap(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrap

@memo
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(60))

小结

  • 散列表的查找 O(n)、插入 O(1) 和删除 O(1) 速度都很快
  • 散列表可用于缓存数据
  • 散列表非常适用于防止重复

你可能感兴趣的