数据结构与算法(Python)
数据结构与算法(Python)
常见的内置数据结构和算法
| 数据结构/算法 | 语言内置 | 内置库 |
| 线性结构 | list/tuple | array/collections.namedtuple |
| 链式结构 | collections.deque | |
| 字典结构 | dict | collections.Counter/OrderdDict |
| 集合结构 | set/frozenset | |
| 排序算法 | sorted | |
| 二分算法 | bisect模块 | |
| 堆算法 | heapq模块 | |
| 缓存算法 | functools.lru_cache |
Collections模块
- namedtuple() --可以创建包含名称的tuple;可以很方便地定义一种数据类型,它具备元组的不变性,又可以根据属性来引用
- deque --类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
- Counter() --dict的子类,计数器,主要用来计数;例如统计字符出现的个数
- OrderdDict() -dict的子类,可以记住元素的添加顺序;
- defaultDict() -dict的子类,可以调用提供默认值的函数;
Python dict底层结构 (哈希表)
- 为了支持快速查找使用了哈希作为底层结构
- 哈希的平均查找时间复杂度O(1)
- Cpython解释器使用二次探查解决哈希冲突问题
Python list与tuple的区别
- 都是线性结构,支持下标访问
- list是可变对象,tuple保存对象的引用不可变
- list不能作为字典的key,tupe可以(可变对象不可哈希)
什么是Lru_Cache?
-
Least-Recently-Used 替换掉最近最少使用的对象
- 缓存剔除策略,当缓存空间不够用的时候需要一种方式剔除key
- 常见的有LRU,LFU等
- LRU通过使用一个循环双端队列不断把最新的key放在表头实现
如何实现LruCache?
- 字典用来缓存,循环双端列表用来记录访问顺序
- 利用Python内置的dict +collections.OrderdDict实现
- dict用来当做k/v键值对的缓存
- OrderedDict用来实现更新最近访问的key
-
View Code""" 缓存剔除策略-LruCache """ from collections import OrderedDict class LruCache(object): """ 当缓存空间不够用的时候,替换掉最近最少使用的对象 """ def __init__(self, capacity=8): self.od = OrderedDict() self.capacity = capacity def get(self, key): if key in self.od: val = self.od[key] self.od.move_to_end(key) # 每次访问更新最新访问的key return val return -1 def put(self, key, value): if key in self.od: # 更新k/v del self.od[key] self.od[key] = value # 更新key到表头 else: # insert self.od[key] = value if len(self.od) > self.capacity: # 判断容量是否满了 self.od.popitem(last=False) def test(): lru = LruCache() assert lru.get(1) == -1 for idx, i in enumerate(range(8)): lru.put(idx, i) assert lru.get(2) == 2 assert lru.get(7) == 7 assert lru.get(0) == 0 lru.put(9, 6) assert lru.get(9) == 6


浙公网安备 33010602011771号