您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python切片模拟LRU算法实现
## 一、LRU算法核心思想
Least Recently Used(最近最少使用)算法是操作系统中常用的页面置换算法,其核心思想是:**当内存空间不足时,优先淘汰最久未被访问的数据**。这种策略基于"局部性原理",即最近被访问的数据很可能在未来再次被访问。
### 算法特点
- 时间复杂度:理想情况下O(1)的访问和插入
- 空间复杂度:O(n)的额外空间
- 适合场景:有明显热点数据的访问模式
## 二、Python实现方案设计
### 2.1 使用列表+字典的方案
```python
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = {} # 存储键值对
self.order = [] # 存储访问顺序
def get(self, key: int) -> int:
if key not in self.cache:
return -1
# 更新访问顺序(先移除后添加)
self.order.remove(key)
self.order.append(key)
return self.cache[key]
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.order.remove(key)
elif len(self.order) >= self.capacity:
# 淘汰最久未使用的
oldest = self.order.pop(0)
del self.cache[oldest]
self.cache[key] = value
self.order.append(key)
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = OrderedDict()
def get(self, key: int) -> int:
if key not in self.cache:
return -1
# 移动到字典末尾表示最近使用
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.cache.move_to_end(key)
elif len(self.cache) >= self.capacity:
# 弹出第一个元素(最久未使用)
self.cache.popitem(last=False)
self.cache[key] = value
class SliceLRU:
def __init__(self, capacity):
self.capacity = capacity
self.keys = [] # 存储键的访问顺序
self.key_to_val = {} # 键值映射
self.key_to_index = {} # 键到索引的映射
def get(self, key):
if key not in self.key_to_val:
return -1
# 将key移动到列表末尾
index = self.key_to_index[key]
self.keys.append(self.keys.pop(index))
# 更新索引映射
for i in range(index, len(self.keys)):
self.key_to_index[self.keys[i]] = i
return self.key_to_val[key]
def put(self, key, value):
if key in self.key_to_val:
# 更新值并调整位置
self.key_to_val[key] = value
self.get(key) # 利用get方法调整位置
return
if len(self.keys) >= self.capacity:
# 移除最久未使用的
oldest = self.keys.pop(0)
del self.key_to_val[oldest]
del self.key_to_index[oldest]
# 添加新元素
self.keys.append(key)
self.key_to_val[key] = value
self.key_to_index[key] = len(self.keys) - 1
class OptimizedSliceLRU:
def __init__(self, capacity):
self.capacity = capacity
self.keys = []
self.cache = {}
def _update_key(self, key):
"""将key移动到列表末尾"""
self.keys.remove(key)
self.keys.append(key)
def get(self, key):
if key not in self.cache:
return -1
self._update_key(key)
return self.cache[key]
def put(self, key, value):
if key in self.cache:
self.cache[key] = value
self._update_key(key)
return
if len(self.keys) >= self.capacity:
del self.cache[self.keys.pop(0)]
self.cache[key] = value
self.keys.append(key)
实现方案 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
列表+字典 | O(n) | O(n) | 实现简单 | remove操作效率低 |
OrderedDict | O(1) | O(n) | 官方实现,效率高 | 依赖特定数据结构 |
切片+索引映射 | O(n) | O(n) | 纯Python实现 | 索引维护复杂 |
切片优化版 | O(n) | O(n) | 代码简洁 | remove仍是O(n)操作 |
def test_lru():
lru = SliceLRU(2)
lru.put(1, 1)
lru.put(2, 2)
assert lru.get(1) == 1
lru.put(3, 3) # 应该淘汰2
assert lru.get(2) == -1
lru.put(4, 4) # 应该淘汰1
assert lru.get(1) == -1
assert lru.get(3) == 3
assert lru.get(4) == 4
实现选择建议:
OrderedDict
性能优化方向:
变种算法:
完整代码示例见GitHub仓库:示例链接(虚构)
注意:实际生产环境中建议使用
functools.lru_cache
装饰器或第三方库(如cachetools
)提供的成熟实现。 “`
这篇文章通过多种实现方案对比,详细讲解了如何使用Python切片模拟LRU算法,包含时间复杂度分析和实际测试案例,总字数约1550字。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。