栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

自学python第四天之实现LUR算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自学python第四天之实现LUR算法

因为也已经接触栈和队列了,所以对于实现lur 应该,可能,大概也能看懂吧~~~

具体什么是lur呢???我就简单的说下吧:
LRU的全称是Least Recently Used,是一种缓存淘汰机制,在有限的内存下,内存满了就干掉一些数据,为新数据提供位置。就好比一部手机的后台逻辑,
首先,我打开软件QQ,其次打开微信,最后打开王者。那么现在后台有3个应用再跑,且后台内存只能满足3个软件跑,
如果我现在想听音乐,当我又打开了QQ音乐的时候,后台就头痛了,4个软件我只能承受3个,为了不发生死机事故,
它就把目前最不得宠的QQ干掉吧,然后其他两个软件共同后移一位,为新的宠儿腾位置。
那这又是为什么那???因为它不会想太多,不会把事情复杂化,它只知道最近被使用的就是有用的,越往后越没用。所以嘛,,,(我懒,,,结论应该知道了吧)
当然,若进不想听音乐,只是想联系他人,不论你打开QQ还是微信,当你再次被使用的时候,某个墙头草就很恭敬的把你请到前面。
好了,废话不多说了,看不懂,就在看看吧。
来,上才艺!!!
class Node:    #初始化节点
    def __init__(self, key, value):
        self.key = key
        self.value = value
        self.pre = None
        self.next = None


class LRUCache:
    def __init__(self, limit):
        self.limit = limit
        self.hash = {}
        self.head = None
        self.end = None

    def get(self, key):    #通过k 返回 v值
        node = self.hash.get(key)
        if node is None:
            return None
        self.refresh_node(node)
        return node.value

    def put(self, key, value):
        node = self.hash.get(key)
        if node is None:
            # 如果key不存在,插入key-value
            if len(self.hash) >= self.limit:           #若链表节点达到上限
                old_key = self.remove_node(self.head)  #通过相应k值去除对应的节点
                self.hash.pop(old_key)                 #干掉 K 值

            node = Node(key, value)                    #若链表节点未达到上限
            self.add_node(node)                        #直接添加新节点
            self.hash[key] = node
        else:
            # 如果key存在,刷新key-value
            node.value = value
            self.refresh_node(node)

    def refresh_node(self, node):
        if node == self.end:       # 若访问的是尾节点,无需移动节点
            return
        key = self.remove_node(node)   #若不是尾节点
        self.hash.pop(key)             #先移出原节点
        self.put(node.key, node.value) #再重新插入节点

    def remove_node(self, node):
        if node == self.head and node == self.end:
            # 移除唯一的节点
            self.head = None
            self.end = None
        elif node == self.end:            #node = K ,若干掉的值为尾元素,
            self.end = self.end.pre       #则新的尾元素为原来的上一级
            self.end.next = None          #新尾元素下的节点值

        elif node == self.head:           #若干掉的值为首元素
            self.head = self.head.next    #则新的首元素为原来的下一级
            self.head.pre = None          #新首元素下的节点值

        else:                             # 若被干掉的元素是在中间节点,则该节点后所有的节点都升迁一位
            node.pre.next = node.pre
            node.next.pre = node.next
        return node.key

    def add_node(self, node):
        if self.end is not None:          #若该尾元素不等于Node ,
            self.end.next = node
            node.pre = self.end
            node.next = None
        self.end = node
        if self.head is None:
            self.head = node


if __name__ == "__main__":
    lruCache = LRUCache(5)
    lruCache.put("1", "韩信")
    lruCache.put("2", "赵云")
    lruCache.put("3", "李白")
    lruCache.put("4", "守约")
    lruCache.put("5", "诸葛")
    print("----------初始化完成后的排序----------")
    print(lruCache.hash.keys())
    print("----------查询完2后的排序----------")
    print(lruCache.get("2"))
    print(lruCache.hash.keys())
    print("----------添加新队员后的排序----------")
    lruCache.put("6", "澜")
    print(lruCache.hash.keys())
当然,代码量也不少,逻辑也稍稍有点复杂,有点绕,但是我也做了相对较全的注解,祝你们好运!!!
最后也给个小建议,我具体没试过,其实也是我的上级boss在看完我的代码后给的建议:
头节点和尾节点的数据不动,给它们确定死了,逻辑判断什么的不带它俩玩,要动就拿中间那些节点动,只需要判断中间节点的变动了。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/741428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号