leetcode 刷题:LRU cache

这道题首先得明白lru是个啥算法:最近最少使用(LRU的翻译)。

一个直观的解决办法是:给每个get或者set操作元素打上时间戳,当cache满了的时候,就扫描整个cache,

淘汰时间戳最久的元素。当然这样的算法淘汰效率比较低,是O(N).

可以利用队列,表示整个cache,每当某个元素被访问,就把这个元素放到队首去。

淘汰的时候淘汰队尾元素。天然的时间戳排序~~淘汰算法变成o(1)微笑

python代码为:

class ListNode:
    def __init__(self,val):
        self.val = val
        self.next = None
        self.pre = None


class LRUCache:
    def __init__(self,capacity):
        self.capacity = capacity


        # the list here is actually the head 
        self.list = None
        self.len = 0
        #self.first = None
        self.tail = None


        self.map = {}


    def update_first(self,node):
        if node != None:
            pre_ = node.pre
            next_ = node.next


            if pre_ !=None:
                pre_.next = next_
    
            if next_!=None:    
                next_.pre = pre_
            # set node as the first node.
            node.pre = None
            node.next = self.list
            self.list.pre = node


            self.list = node


    def get(self,key):
        try:
            node = self.map[key]
        except :
            return -1
        self.update_first(node)
        return node.val


    def set(self,key,value):
        if key in self.map:
            node = self.map[key]
            node.val = value
            self.update_first(node)
        else:
            if self.len == self.capacity:
                self.tail = self.tail.pre
                # in case the capacity is only 1
                if self.tail == None:
                    self.list = None
                else:
                    # although follow 1 step maybe useless,let's clean it anyway.
                    self.tail.next.pre = None
                    self.tail.next = None
            else:
                # i know this is ungly and not thread safe,
                # but, let's just ignore that.
                self.len+=1


            node = ListNode(value)
            self.map[key] = node


            node.next = self.list
            if self.list != None:
                self.list.pre = node
            self.list = node
            # if there is only on node here.
            if self.tail == None:
                self.tail = node






def main():
    lru = LRUCache(1)
    lru.set(2,1)
    
    print lru.get(2)
    lru.set(3,2)
    print lru.get(2)
    print lru.get(3)


if __name__ == '__main__':
    main()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值