Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.8 如何实现LRU缓存方案

本文是Python程序员面试中关于算法的解题总结,重点探讨第二章的栈、队列与哈希应用。针对2.8节的LRU缓存方案,详细解释了如何利用数据结构高效实现这一常见面试题。
摘要由CSDN通过智能技术生成
# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.8 如何实现LRU缓存方案

题目:
LRU就是最近最少使用,请实现。

分析:
最近最少使用实际就是在缓存不够的时候将最先进入的删除掉,那么这就可以使用队列完成。
将需要删除的最前面的n个元素删除即可。
使用双向链表来实现队列,队列最大容量为缓存大小。把最近使用的页面移动到队列头,
最近没有使用的放在队列尾部。
使用哈希表,建立: <页号,队列中该页面对应节点地址>的节点字典。
当引用页面在队列中,则将页面对应节点移动到队列头部,
否则,将一个新节点添加到队列前面,并更新节点字典。
若队列已经满了,那么就从队列尾部移除一个节点,并将新节点添加到队列前面

关键:
1  缓存有大小
最近访问的页面需要放置到队列头部;
队列满,需要移除队尾元素;
需要建立字典保存<页号,队列中页面对应节点地址>

参考:
Python程序员面试算法宝典
'''

from collections import deque

class LRU(object):
    def __init__(self, cacheSize):
        self.cacheSize = cacheSize
        self.queue = deque()
        self.hashSet = set()

    def full(self):
        return len(self.queue) >= self.cacheSize

    def enQueue(self, data):
        # 如果待入队元素在队列中,则移动到队头
        if data in self.hashSet:
            self.queue.remove(data)
            self.queue.appendleft(data)
        else:
            self.hashSet.add(data)
            # 如果队列已经满了,则先移除队尾的元素,然后将待入队元素放入队头
            if self.full():
                self.queue.pop()
            self.queue.appendleft(data)

    def deQueue(self):
        self.queue.pop()

    def deQueueRemove(self, data):
        self.queue.remove(data)

    def printLRU(self):
        info = ""
        for value in self.queue:
            if info:
                info += " " + str(value)
            else:
                info += str(value)
        print info


def process():
    cacheLRU = LRU(3)
    cacheLRU.enQueue(1)
    cacheLRU.enQueue(2)
    cacheLRU.enQueue(3)
    cacheLRU.enQueue(1)
    cacheLRU.enQueue(6)
    cacheLRU.enQueue(7)
    cacheLRU.printLRU()


if __name__ == "__main__":
    process()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值