LRU Cache

这是一道leetcode的难题,这种题往往是算法结构很复杂,涉及一个或多个考点算法和数据结构的组合,同时又有很多corner cases要考虑。所以一定要找到合适memorize的结构,这样很容易推导出整个题目的解。否则会不断的记了忘忘了记。

这题分成大面上有两个考点,一个是LRU算法本身,另一个是hash table和doubly list的操作。LRU算法围绕两个接口get() and put()。这题的internal data structure之所以是hash table和list的结合是因为接口支持基于key的操作,而进出则是基于顺序,所以hash table用来支持key query,而list可以跟踪访问顺序。用到doubly list是因为其支持list上单node的reference的所有操作,不需要同时保存prev或者next的reference。
high-level操作

  • get():从hash table查询key value返回值,同时移动key对应的node到队列头
  • put():考虑两种情况:key已经在cache中存在或者不存在。
    • 如果存在,与get的操作类似。
    • 如果不存在,因为LRU cache的capacity有限,进一步考虑是否当前cache中的key已经等于当前capacity
      • 如果等于,需要删除list的最后node,然后插入新的到hash table和队头
      • 如果小于,直接插入新的到hash table和队头

low-level细节

  • 根据high-level算法,无论是更新存在的key或者加入新key,对list只有两个基本操作removeNode()和addNodeToHead(),核心都是更新prev和next reference。无论是删除还是添加,都有可能对队头node,所以需要一个dummy node作为sentinel head
  • corner cases:对于删除操作,一般的操作是更新next node的prev,所以对于tail,其next node为null,需要忽略这步。类似,对于添加到队头操作,需要更新当前队头node的prev,所以如果是空list,也要忽略这步。
class LRUCache(object):class ListNode(object):def __init__(self, key, val):self.key = keyself.val = valself.next = Noneself.prev = Nonedef __init__(self, capacity):""":type capacity: int"""self.capacity = capacityself.size = 0self.hmap = {}self.dummy = self.ListNode(0,0)self.tail = self.dummydef get(self, key):""":rtype: int"""hmap=self.hmapif key not in hmap:return -1val = hmap[key].valself.deleteNode(hmap[key])self.addNode(hmap[key])return valdef set(self, key, value):""":type key: int:type value: int:rtype: nothing"""hmap=self.hmapif key not in hmap:print self.size,self.capacityif self.size==self.capacity:print self.tail.keyhmap.pop(self.tail.key)self.deleteNode(self.tail)self.size-=1hmap[key]=self.ListNode(key,value)self.addNode(hmap[key])self.size+=1else:hmap[key].val=valueself.deleteNode(hmap[key])self.addNode(hmap[key])def deleteNode(self, node):# print self.hmap, node.val, self.tail.valif self.tail==node:self.tail = self.tail.prevself.tail.next = Noneelse:node.prev.next = node.nextnode.next.prev = node.prevdef addNode(self, node):dummy = self.dummyif dummy.next:dummy.next.prev = nodeelse:self.tail = nodenode.prev = dummynode.next = dummy.nextdummy.next = node

转载于:https://www.cnblogs.com/absolute/p/5983282.html

边工作边刷题:70天一遍leetcode: day 98相关推荐

  1. 边工作边刷题:70天一遍leetcode: day 94-1

    Largest BST Subtree 要点: http://articles.leetcode.com/largest-binary-search-tree-bst-in 这题重点是理解题意,还有道 ...

  2. 边工作边刷题:70天一遍leetcode: day 11-2

    Gas Station 老题,这种circular的题一般都能转化成单向的.比如这题就是用sumDiff来判断是否有解,而start单向递增. class Solution(object):def c ...

  3. 边工作边刷题:70天一遍leetcode: day 92

    House Robber I/II/III 这题代表了单向线性dp的基本pattern: build local best value at each element and track the gl ...

  4. 边工作边刷题:70天一遍leetcode: day 97-2

    Design Hit Counter 要点:因为是second granularity,所以可以用以秒为单位的circular buffer方法.这题简单在只需要count过去300秒的,增加难度可以 ...

  5. 边工作边刷题:70天一遍leetcode: day 73

    Read N Characters Given Read4 I/II 要点:这题的要点就是搞清楚几个变量的内在逻辑:只有buffer是整4 bytes的.而client要读的bytes(需求)和实际上 ...

  6. 边工作边刷题:70天一遍leetcode: day 7

    Max Points on a Line 要点:这题暴力解是用任何两点确定一条直线,然后对其他点检查是否共线,显然,这里没用空间来存储之前的检查结果,所以time complexity是O(n^3). ...

  7. 边工作边刷题:70天一遍leetcode: day 67-1

    Rectangle Area 要点:基本思路就是先分开算再减去相交部分,这题的难点是如何检查是否相交和如何算出相交部分的面积. 2d转化为1d:x轴和y轴是orthogonal的.可以分开考虑.这样检 ...

  8. 边工作边刷题:70天一遍leetcode: day 6

    Compare Version Numbers 题本身思路简单没什么可说的.值得一提的是corner case:多出来的0和没有是相同版本,这样最简单的处理是直接对没有的补0.这样因为需要补齐,循环是 ...

  9. 边工作边刷题:70天一遍leetcode: day 11-1

    Clone Graph dfs或者bfs都可以做,这题的要点是hashmap有两个作用:一是图遍历中的visited,另一个是存copy的结点来连接neighbors.hashmap即表示visite ...

最新文章

  1. 面向回家编程!GitHub标星两万的Python抢票教程”,我们先帮你跑了一遍
  2. Jmeter 多台机器产生负载及问题解决方法
  3. php pdo blob,PHP / PDO / MySQL:插入MEDIUMBLOB存储坏数据
  4. BZOJ1598: [Usaco2008 Mar]牛跑步
  5. putty连接Linux
  6. (DFS or BFS)Find The Multiple(poj1426)
  7. Linux日常运维管理技巧(二)Linux防火墙:你可以ping别人,别人ping不了你、转发、代理
  8. OpenShift 4 之升级集群
  9. Python-datetime模块
  10. C++ 读写TXT文件
  11. ad导出元件清单_如何Altium Designer 中输出元件清单(BOM表格)
  12. 多列堆积柱形图怎么做_Excel2010中进行制作多列堆积图的操作方法|多列堆积柱状图...
  13. 端口映射不能访问80端口
  14. 什么是光电耦合器?光耦有哪些类型
  15. Tomcat开启APR模式并设置Tomcat为开机自启动服务
  16. 人生感悟--------藏锋
  17. 数据库课程设计-员工信息管理系统(基于python和MySQL实现)
  18. windows下putty自动登录和窗口显示IP
  19. 快讯:湘江实验室在长沙揭牌成立;中国移动算网升级3AZ重磅发布
  20. flex:默认值;flex:1;flex:auto; 使用

热门文章

  1. 两台linux之间传递文件
  2. Asp.Net验证控件和表达式测试题
  3. hive一次加载多个文件_0738-6.2.0-如何在Hive中使用多分隔符
  4. Nginx学习笔记---ngx_table_elt_t数据结构
  5. tf.app.flags 定义命令行可选参数
  6. 《剑指offer》二维数组中的查找
  7. arcgis api for javascript创建webscene
  8. 线程池是如何复用的?
  9. Lamport Logical Clock 学习
  10. JVM实用参数(六) 吞吐量收集器