算法图解 (五)

第五章 散列表

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

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

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

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

# 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) 速度都很快
  • 散列表可用于缓存数据
  • 散列表非常适用于防止重复
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容