题目:运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制。
它应该支持以下操作:获取数据get和写入数据put。
获取数据get(key)-如果密钥(key)存在于缓存中,则获取密钥的值(总是正数),否则返回-1。
写入数据put(key,value)-如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。
当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
示例:LRUCachecache=newLRUCache(2/*缓存容量*/);cache.put(1,1);cache.put(2,2);cache.get(1);//返回1cache.put(3,3);//该操作会使得密钥2作废cache.get(2);//返回-1(未找到)cache.put(4,4);//该操作会使得密钥1作废cache.get(1);//返回-1(未找到)cache.get(3);//返回3cache.get(4);//返回4
代码:
原理:
如图:图中的页面为三页,依次向存储中加入432143543215这些数字。
而存储空间只能存储三个页面,所以会按照上述规则不断淘汰已经存储在页面中的数字。
解题思路(logN的思路):
知道了LRU的置换规则后,由于此题需要存储的是key和value,所以
其次,选择一种合适的数据结构来解决存储优先级问题,此处我们采用内部是小顶堆的PriorityQueue优先级队列用来实现times最小的元素在队头
但是我们会在让新元素入队之前可能会删除队列中指定元素,当然可以去遍历队列,但是这样太慢了
我们可以再用一种HashMap的数据集合用来存储节点,以便快速通过node的key来得到整个node。
THE END