你有一排书架,有空时会拿些书来看,经常性会买些新书。无奈书架容量有限,当新买的书放不下时,需要一个策略将旧书淘汰。

LRU(最近最少使用)缓存淘汰机制正合适。

1)新买的书放在最左侧。

2)最近常看的书也放在最左侧。

久而久之,越往右边的书越是长时间没看,当有新书时,就从右侧淘汰起。Perfect。

下面一起来动手实现这个算法。附加条件只有一个,要在 O(1) 的时间复杂度内完成操作。

查找操作能在O(1)的数据结构: 哈希

增、删除操作能在O(1)的数据结构:链表

所以考虑哈希 + 单链 或哈希 +双链表。不过现实中,双链表的使用场景远多于单链表。

原因大家仔细考虑下,欢迎留言

class ListNode:
def __init__(self, key = None, value =None):
self.key = key
self.value = value
self.prev = None
self.next = None class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.hashmap = {} # 哨兵
self.head = ListNode()
self.tail = ListNode() self.head.next = self.tail
self.tail.prev = self.head def move_node_to_tail(self, key): node = self.hashmap[key]
node.prev.next = node.next
node.next.prev = node.prev node.prev = self.tail.prev
node.next = self.tail
self.tail.prev.next = node
self.tail.prev = node def get(self,key:int) -> int:
if key in self.hashmap:
self.move_node_to_tail(key)
res = self.hashmap.get(key, -1)
if res == -1:
return res
else:
return res.value def put(self, key:int, value:int)->int:
if key in self.hashmap:
self.hashmap[key].value= value
self.move_node_to_tail(key)
return
if len(self.hashmap) == self.capacity:
self.hashmap.pop(self.head.next.key)
self.head.next = self.head.next.next
self.head.next.prev = self.head new = ListNode(key,value)
self.hashmap[key] = new
new.prev = self.tail.prev
new.next = self.tail
self.tail.prev.next = new
self.tail.prev = new

最新文章

  1. JavaScript基本语法(四)
  2. Nagios配置文件详解
  3. H5之contenteditable
  4. 快速理解Kafka分布式消息队列框架
  5. onTouch与onClick事件的关系
  6. ubuntu 设置显示器的亮度
  7. SQL优化之索引
  8. java基础学习总结四(控制语句<顺序、选择、循环>、方法)
  9. java整合flex
  10. java基础:数组的复制
  11. ldap数据库--ODSEE--复制协议
  12. C. Kyoya and Colored Balls(Codeforces Round #309 (Div. 2))
  13. win7局域网共享文件
  14. 消息中间件activemq的使用场景介绍(结合springboot的示例)
  15. Centos6.5 pppoe-server
  16. Python matplotlib.pyplot
  17. 恢复Windows 10自带的微软正黑字体
  18. linux学习笔记整理(七)
  19. Activiti reassign task to another user
  20. MySQL记录-Lost Connect MySQL Server during query解决方案

热门文章

  1. Shell编程、part2
  2. flask 重定向详解
  3. Sqlserver 2012附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
  4. C语言作业08
  5. hibernate字段映射枚举类型
  6. centos7 源码编译安装 php
  7. Python基础数据类型str字符串
  8. Python 最常见的 170 道面试题全解析:2019 版
  9. Doker GRPC "Connection reset by peer"
  10. k路归并