目录
前言
昨天忘记看了,初次接触刷题花了比较长时间,今天继续阅读。
再谈大O
- 快速查找的常量比合并查找小,虽然都为O(nlogn),快速查找的速度将更快
- 快速查找调用栈的高度为O(log n),每层需要的时间为O(n)。因此需要的时间为O(n) * O(log n) = O(n log n);在最糟情况下,有O(n)层,因此该算法的运行时间为O(n) * O(n) = O(n2)
散列表
散列函数
- 散列函数:“将输入映射到数字”,固定输入固定输出,不同输入不同输出
- 散列表:散列映射、映射、字典和关联数组
- python散列表用字典键值对实现:
-
book = dict() # 创建散列表(字典) book["apple"] = 0.67 # 添加商品价格 book["milk"] = 1.49 book["avocado"] = 1.49 # print book # {'avocado': 1.49, 'apple': 0.67, 'milk': 1.49}
-
应用案例
- 查找:模拟映射关系
- 防止重复:速度比列表添加后的简单查找快
-
voted = {} # 创建名单 def check_voter(name): # 看这个人是否投过票 if voted.get(name): # 在则返回名字 print "kick them out!" else: # 否则返回None voted[name] = True print "let them vote!" # >>> check_voter("tom") # let them vote! # >>> check_voter("mike") # let them vote! # >>> check_voter("mike") # kick them out!
-
- 缓存:记住数据,以免服务器再通过处理来生成它们。
-
cache = {} def get_page(url): if cache.get(url): return cache[url] # 返回缓存的数据 else: data = get_data_from_server(url) cache[url] = data # 先将数据保存到缓存中 return data
-
冲突
- 冲突定义:给两个键分配的位置相同
- 经验:可在后面添加链表,散列函数很重要
性能
- 避免冲突的方法:较低的填装因子;良好的散列函数。
填装因子
- 经验规则:一旦填装因子大于0.7,就调整散列表的长度
良好的散列函数
- 散列函数的结果必须是均匀分布的,它们的映射范围必须尽可能大。
后言
今天就看到这,没想到这书已经近半了,就我学过408的来说,散列这里讲的很容易懂,但是也挺浅显的,毕竟科普书嘛,知识的深入还得看看教科书