Python双链表详细讲解实现:模拟计算机缓存淘汰算法,FIFO,LRU以及LFU!

实现FIFO缓存置换算法(Python) 关于FIFO 淘汰缓存时,把最先进入链表的结点淘汰掉。 具体实现(Python) (代码中引进的双向链表内容请查看-->https://blog.youkuaiyun.com/huanglei305/article/details/99422314) # -*- encoding=utf-8 -*- from computer_principle.DoubleLinkedList impor... 阅读详情

替换策略以及 cache的写操作策略

在这里插入图片描述

  • cache写入策略(类似redis 和 数据库的关系。 先写入缓存,还是先写入数据库)
    在这里插入图片描述

首先建立双向链表

  • 要注意的是,双链表增加头结点,会很方便操作
  • 还有双链表的插入删除操作
  • 上代码:
  • 功能
    • 弹出头部节点(pop)
    • 默认尾部添加结点(append),尾插法
    • 往头部添加结点(append_front),头插法
    • 删除节点(remove),不加参数时,删除尾部结点, 加蚕食时,删除指定结点
    • 打印 字符串格式化的 链表(print)
#! -*- encoding=utf-8 -*-

class Node:
    def __init__(self, key=0, value=0):
        self.key = key
        self.value = value
        self.prev = None
        self.next = None
    

    def __str__(self):
        val = '{%d: %d}' % (self.key, self.value)
        return val


class DoubleLinkedList():
    def __init__(self, capacity=0xffff):
        """
        param:  capacity: 链表容量
        param:  head: 头指针,指向头结点。 head.next == None。头结点的好处很多:
                1. 使首元结点(第一个正式存放数据的节点)无序进行特殊处理,表示都是 xxx.next
                2. 便于非空表和空表的统一处理。 判空为head.next == None。  不会存在头指针直接指向 None的情况
                3. 头结点还可存储一些信息。
        param:  tail: 尾指针,表为空时,头尾指针都指向头结点
        param:  cur_size: 当前链表长度
        """
        self.capacity = capacity
        self.head = Node()
        self.tail = self.head
        self.cur_size = 0


    def __add_head(self, node):
        """
            头插法向链表中插入数据,分三种情况:
            1. 为空链表
            2. 不为空, 没达到最大容量
            3. 达到最大容量
        """
        if not self.head.next:
            self.head.next = node
            node.prev = self.head
            self.tail = node
        elif self.cur_size < self.capacity:
            # 分析四个步骤,顺序还不能错。
            # node先将节点指向对应位置
            node.prev = self.head
            node.next = self.head.next
            # 在更新链表节点指针
            self.head.next.prev = node
            self.head.next = node
        else:
            pass

        self.cur_size += 1
        return node


    def __add_tail(self, node):
        """
            尾插法: 同样分三种情况
            设置头结点的好处就体现出来了! 本来还要进行分情况讨论链表是否为空,
            这里就不需要讨论了~ ,都进行统一处理。
        """
        self.tail.next = node
        node.prev = self.tail
        self.tail = self.tail.next
        self.cur_size +=1
		# 出 bug了! 这里的逻辑是当前插入的节点是新节点。 next = None。 但是如果是从一个链表中取出来该节点(__remove操作只是修改了 该节点前一个节点的next指针,后一个节点的prve指针。所以该节点next,prve指针,仍然没做改变,指向原来的前一个节点,后一个节点),放到另一个链表的尾部, 该节点的删除操作,netx指针还指向的有值,需要置None
        node.next = None
        return node
    

    def __remove(self, node=None):
        """
            删除任意节点:
            1. 当不传入node时,默认尾部删除
            2. node就是 尾部结点
            3. 删除其他位置结点
        """
        if not node or node == self.tail:
            self.__del_tail()    
        else:
            node.prev.next = node.next
            node.next.prev = node.prev
        
        self.cur_size -= 1
        return node


    def __del_head(self):
        """ 
            删除首元结点
            头结点使得处理逻辑都是一样的,直接调用 __remoove()方法 
        """
        return self.__remove(self.head.next)
    

    def __del_tail(self):
        """ 删除尾部结点 """    
        if self.head.next == None: # 空链表无法删除
            return 
        p = self.tail
        self.tail.prev.next = None
        self.tail = self.tail.prev
        self.cur_size -= 1
        e = self.tail
        return p


    # 提供对外的API接口
    def pop(self):
        """ 弹出头部节点 """
        return self.__del_head()


    def append(self, node):
        """ 默认尾部添加结点 """
        return self.__add_tail(node)


    def append_front(self, node):
        """ 往头部添加结点 """
        return self.__add_head(node)


    def remove(self, node = None):
        """ 删除节点 """
        return self.__remove(node)


    def print(self):
        """ 打印当前链表 """
        p = self.head
        line = ''
        while p.next:
            line += '%s' % p.next
            line += ' ==> ' 
            p = p.next

        print(line)



# 测试
if __name__ == '__main__':
    l = DoubleLinkedList(10)
    nodes = []
    for i in range(10):
        node = Node(i, i)
        nodes.append(node)

    l.append(nodes[0])
    l.print()
    l.append(nodes[1])
    l.print()
    l.pop()
    l.print()
    l.append(nodes[2])
    l.print()
    l.append_front(nodes[3])
    l.print()
    l.append(nodes[4])
    l.print()
    l.remove(nodes[2])
    l.print()
    l.remove()
    l.print()

测试结果的正确性:运行结果如下
[root@localhost 计算机组成]# python3 双向链表实现.py 
{0: 0} ==> 
{0: 0} ==> {1: 1} ==> 
{1: 1} ==> 
{1: 1} ==> {2: 2} ==> 
{3: 3} ==> {1: 1} ==> {2: 2} ==> 
{3: 3} ==> {1: 1} ==> {2: 2} ==> {4: 4} ==> 
{3: 3} ==> {1: 1} ==> {4: 4} ==> 
{3: 3} ==> {1: 1} ==> 

缓存置换算法实现

  • 下列代码实现只是考虑了缓存替换,并没有考虑主存的相关操作。

(一)FIFO(先进先出算法)

在这里插入图片描述

from DoubleLinkedList import DoubleLinkedList, Node


class FIFOCache(object):

    def __init__(self, capacity):
        """
        param:  capacity: 也是用来设置容量大小的
        param:  map: 定义映射表。加快链表元素的查找速度。
                     key就是 链表key,value就是 node节点本身的引用
        param:  list: 双向链表对象
        param:  list: 当前元素个数
        """
        self.capacity = capacity
        self.map = {}
        self.list = DoubleLinkedList(self.capacity)
        self.size = 0

    
    def get(self, key):
        """ 实现get方法 
            找到返回value, 找不到返回 -1
        """
        node = self.map.get(key, None)
        if not node: return -1

        return node.value


    def put(self, key, value):
        """ 实现put方法
            if 如果已存在:
                则1.更新该节点对应的value,2.将该节点从原位置删除,3.将节点添加到尾部
                (好处是,少了重复创建结点)
            else:不存在就判断是否插入新的
                if 容量已满:
                    需要删除(头部节点, 删除map中的映射)
                添加
        """
        node = self.map.get(key, None)
        if node: 
            # node存在,相当于更新操作,需要删除原来位置,在添加到链表尾
            self.list.remove(node)
            node.value = value
            self.list.append(node)
        else: 
            if self.size == self.capacity:
                node = self.list.pop()
                del self.map[node.key]
                self.size -= 1
            node = Node(key, value)
            self.list.append(node)
            self.map[key] = node
            self.size += 1
        

    def print(self):
        self.list.print()



# 测试
if __name__ == '__main__':
    cache = FIFOCache(2)
    cache.put(1, 1)
    cache.print()
    cache.put(2, 2)
    cache.print()
    print(cache.get(1))
    cache.put(3, 3)
    cache.print()
    print(cache.get(2))
    cache.print()
    cache.put(4, 4)
    cache.print()
    print(cache.get(1))

# 运行结果
[root@localhost 计算机组成]# python3 FIFO.py 
{1: 1} ==> 
{1: 1} ==> {2: 2} ==> 
1
{2: 2} ==> {3: 3} ==> 
2
{2: 2} ==> {3: 3} ==> 
{3: 3} ==> {4: 4} ==> 
-1

(二)LRU(最近最少使用算法)

在这里插入图片描述

  • 上代码实现:

from DoubleLinkedList import DoubleLinkedList, Node


class LRUCache():

    def __init__(self, capacity):
        self.capacity = capacity
        self.map = {}
        self.list = DoubleLinkedList(self.capacity)
        self.size = 0

    def get(self, key):
        """
            LRU算法,当在链表中时,不仅缓存,还要将缓存置于链表头部
        """
        node = self.map.get(key, None)

        if not node: return -1
        self.list.remove(node)
        self.list.append_front(node)
        return node.value


    def put(self, key, value):
        """
            if 已经存在该结点:
                (实际上就是更新cache了)
                1. 删除原来在的位置
                2. 更新值value
                3. 重新插入到链表头部
            else: 
                if 缓存已经满了(达到长度)
                    删除最后一个元素(最近最少使用的结点)
                    表头加入新元素
                else:
                    未满,直接表头加元素
        """
        node = self.map.get(key, None)

        if node:
            self.list.remove(node)
            node.value = value
            self.list.append_front(node)
        else:
            node = Node(key, value)
            if self.size == self.capacity:
                old_node = self.list.remove()
                self.map.pop(old_node.key)
                self.size -= 1

            self.list.append_front(node)
            self.map[key] = node
            self.size += 1

    
    def print(self):
        self.list.print()


# 测试
if __name__ == '__main__':
    cache = LRUCache(2)
    cache.put(2, 2)
    cache.print()
    cache.put(1, 1)
    cache.print()
    cache.put(3, 3)
    cache.print()
    print(cache.get(1))
    cache.print()
    print(cache.get(2))
    cache.print()
    print(cache.get(3))
    cache.print()


# 运行结果
[root@localhost 计算机组成]# python3 LRU.py 
{2: 2} ==> 
{1: 1} ==> {2: 2} ==> 
{3: 3} ==> {1: 1} ==> 
1
{1: 1} ==> {3: 3} ==> 
-1
{1: 1} ==> {3: 3} ==> 
3
{3: 3} ==> {1: 1} ==> 

(三)LFU(最不经常使用算法)

在这里插入图片描述

  • 上代码实现
from DoubleLinkedList import DoubleLinkedList, Node


class LFUNode(Node):
    """ 继承Node节点类,新加属性freq表示频率 """

    def __init__(self, key, value) -> None:
        super(LFUNode, self).__init__(key, value)
        # 频率
        self.freq = 0


class LFUCache():

    def __init__(self, capacity):
        """
        param:  map: 依然保存所有节点的映射,方便查询 
        param:  freq_map: 字典类型。
                    key: 频率, value:频率对应的双链表。
                    当发生淘汰时:
                    1. 选择频率最低的链表
                    2. 选择从链表头部删除(因为尾部添加元素, 头部的元素在时间上,也是最久未被访问的)

        param:  size: 当前节点个数。
                    没有一个链表存储所有节点。 而是把节点都分开,按照频率,存放在每个小的链表里
        param:  capacity: 总容量 
        """
        self.capacity = capacity
        self.map = {}
        self.freq_map = {}
        self.size = 0


    def __update_freq(self, node):
        """ 更新结点频率 """
        freq = node.freq
        # 将原来所以在的频率链表的节点删除
        node = self.freq_map[freq].remove(node)
        if self.freq_map[freq].cur_size == 0:
            del self.freq_map[freq]
        # 更新后插入到新的频率链表
        freq += 1
        node.freq = freq
        if freq not in self.freq_map: 
            self.freq_map[freq] = DoubleLinkedList()
        # 向链表尾部添加
        self.freq_map[freq].append(node)  




    def get(self, key):
        node = self.map.get(key, None)
        if not node: return -1
        # 找到节点,更新节点的频率
        self.__update_freq(node)

        return node.value

    
    def put(self, key, value):
        node = self.map.get(key, None)
        # 缓存命中的时候
        if node: 
            node.value = value
            self.__update_freq(node)
        # 缓存不命中
        else:
            # 容量已满,需要淘汰
            if self.size >= self.capacity:
                min_freq = min(self.freq_map)
                # 从头部去掉
                node = self.freq_map[min_freq].pop()
                del self.map[node.key]
                self.size -= 1
            node = LFUNode(key, value)
            node.freq = 1
            self.map[key] = node
            # 如果不存在该频率(1频率) 的链表,那就创建一个先
            if node.freq not in self.freq_map:
                self.freq_map[node.freq] = DoubleLinkedList()
            # 尾部添加
            node = self.freq_map[node.freq].append(node)  
            self.size += 1
    
    def print(self):
        print('-'*50)
        for k, v in self.freq_map.items():
            print('freq = %d' % k)
            v.print()
        print('$'*50)


# 测试代码
if __name__ == "__main__":
    cache = LFUCache(2)
    cache.put(1, 1)
    cache.print()
    cache.put(2, 2)
    cache.print()
    print(cache.get(1))
    cache.print()
    cache.put(3, 3)
    cache.print()
    print(cache.get(2))
    cache.print()
    print(cache.get(3))
    cache.print()
    cache.put(4, 4)
    cache.print()
    print(cache.get(1))
    cache.print()
    print(cache.get(3))
    cache.print()
    print(cache.get(4))
    cache.print()
    

# 测试结果
[root@localhost 计算机组成]# python3 LFU.py 
--------------------------------------------------
freq = 1
{1: 1} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
--------------------------------------------------
freq = 1
{1: 1} ==> {2: 2} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
1
--------------------------------------------------
freq = 1
{2: 2} ==> 
freq = 2
{1: 1} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
--------------------------------------------------
freq = 1
{3: 3} ==> 
freq = 2
{1: 1} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
-1
--------------------------------------------------
freq = 1
{3: 3} ==> 
freq = 2
{1: 1} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3
--------------------------------------------------
freq = 2
{1: 1} ==> {3: 3} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
--------------------------------------------------
freq = 2
{3: 3} ==> 
freq = 1
{4: 4} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
-1
--------------------------------------------------
freq = 2
{3: 3} ==> 
freq = 1
{4: 4} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3
--------------------------------------------------
freq = 1
{4: 4} ==> 
freq = 3
{3: 3} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
4
--------------------------------------------------
freq = 3
{3: 3} ==> 
freq = 2
{4: 4} ==> 
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

STM32F407驱动OV2640摄像头全栈解析:DCMI+DMA+SCCB协同设计 图像采集是嵌入式视觉系统的基石,其核心在于传感器与MCU间的数据通路构建。原理上需理解并行接口(如DCMI)的硬件同步捕获机制、串行控制总线(如SCCB/I²C)的寄存器级配置逻辑,以及DMA在高吞吐数据搬运中的关键作用。技术价值体现在解放CPU、保障实时性、降低功耗,并支撑JPEG压缩与RGB565直显等差异化应用。典型场景包括智能终端实时预览、低带宽图像上传、工业现场视频监控及教学实验平台搭建。本文以STM32F407与OV2640集成实践为载体,深入剖析DCMI时序约束、SCCB软件模拟实现及DMA循 阅读详情

相关推荐

Delta并联机构运动学正逆解:从理论建模到Matlab实战

本文深入解析了Delta并联机构运动学正逆解的核心原理与实战方法。通过几何建模,清晰阐述了其“逆解简单、正解复杂”的特性,并详细推导了基于一元二次方程的逆解解析算法与采用牛顿-拉弗森迭代法的正解数值算法。文章结合完整的Matlab代码实例,从符号推导到数值求解,提供了从理论到实践的完整实现路径,助力机器人开发者掌握Delta并联机构的运动学分析。

weixin_29096377的博客 432

数据结构:双向循环链表、栈、队。

数据结构中的双向循环链表、栈、队的相关操作

Summer_taotao的博客 447

三菱JET伺服限位、原点信号通过PLC刷新设置方法

RWw及RWr软元件的初始设定值,可通过 [Pr. PA01.0 控制模式选择] 及 [Pr. PN22.0 默认映射模式选择] 的值进行切换。JET伺服参数用于CC-Link IE现场网络Basic。循环通信的请求报文与响应报文的收发数据被换读为伺服放大器的对象数据 (RWwn、RWrn)。接下来看映射字2D05具体的内容: 也就是2D05操作字的第九位、第十位、第十一位。响应报文的设定值可进行变更。变更初始设定值时,应变更PDO映射。不同的模式,对应不同的刷新映射内容。GXWORKS3程序。

qq_51166033的博客 8048

python中 队列的理解

python中 小编了解的总共有三种队列 分别是fifo先进先出 还有lifo先进后出 其次还有priority优先级的队列(数字越小 优先级别越高) 下面小编就给大家分别介绍一下三种队列的用法 和一些注意情况 一 fifo队列 也叫先进先出队列 意思是 先放进队列的 会优先出去进行消费 比如 看下方代码 import queue as myqueue """fifo 先进先出队...

839

ESP32+micro-ROS机器人开发实战:轻量级ROS2嵌入式集成

ROS2是现代机器人软件栈的核心框架,其基于DDS的分布式通信与QoS保障能力为多节点协同提供基础支撑;而micro-ROS作为专为微控制器优化的ROS2兼容中间件,解决了资源受限设备(如ESP32)接入ROS2生态的关键难题。其通过分层架构将DDS通信下沉至上位机Agent,使MCU仅需运行轻量Client,大幅降低内存开销(实测<180KB)并保留标准ROS2接口语义。该方案广泛应用于教育机器人、移动底盘、传感器节点等嵌入式场景,尤其适合基于ESP-IDF开发的Wi-Fi/BLE物联网机器人系统。本文以

weixin_29025501的博客 398

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 250

用双向链表实现内存置换算法(二)

用双向链表实现内存置换算法(二) FIFO(First in first out) 这里使用之前实现了的双向链表来实现FIFO算法。 FIFO算法还是比较好理解的,如果内存满了,则最先淘汰先进入的。 直接上代码: from DoubleLinkedList import DoubleLinkedList, Node class FIFOCache: def __init__(self, capacity): self.capacity = capacity se

weixin_45451171的博客 233

分析以太网帧结构_100G以太网接口调试初体验

是的,标题没有多敲一个“0”,明人不说暗话,就是在FPGA上实现100G以太网接口设计。正好参与了实验室某项目中的100G接口的调试,早想写个专栏文章了,由于调试过程中发现了一些硬件问题,导致迟迟没有往前推进,现在问题解决了之后可以简单分享一下100G以太网接口的调试初体验了~(好像DDR4读写测试系列文章还没搞完 )这篇初体验暂时不分多个章节了,基本设计流程与之前发布的“10G以太网接口”系列文...

weixin_39574050的博客 1601

计算机基础:21、计算机基础实践-双向链表数据结构、FIFO算法、LRU算法

计算机基础:21、计算机基础实践-双向链表的原理与实践单向链表与双向链表的简介双向链表数据结构 单向链表与双向链表的简介 双向链表数据结构 下方的代码实现了上图中的功能(双向链表数据结构) # node类表示在链表中的节点 class Node: def __init__(self, key, value): self.key = key self.value = value self.prev = None # 用于存储上一个节点 self.next = None # 用于存储下一

weixin_36020178的博客 512

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3941

YOLO26 魔术师专栏|全网独家首发!2026 原创级创新赋能 CV 全场景

基于 YOLO26 核心架构迭代,融合原创自研、2026 AAAI/CVPR/ICCV 顶会前沿成果,打造更高效、更灵活、更具创新性的计算机视觉解决方案!

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4356

数据结构学习笔记

数组是一种线性数据结构,用于存储固定大小的相同类型元素集合。每个元素都有一个索引,用于快速访问。链表是一种由节点组成的数据结构,每个节点包含存储数据的部分以及指向下一个节点的指针。通过节点之间的指针连接,形成了链表的结构。链表可以分为单链表、双向链表和循环链表等不同类型,它们各自具有特定的特点和应用场景。数据元素:节点存储的实际数据。数据可以是任意类型,例如整数、字符、字符串、对象等。指针(或引用):指向下一个节点的指针。它存储了下一个节点在内存中的地址,通过这个指针可以找到链表的下一个节点。

YiRan_Zhao的博客 993

第一章:Profibus DP通信简介

PROFIBUS (Process Fieldbus)的缩写,是一种国际化的、开放的、不依赖于设备生产商的现场总线标准。它广泛应用于制造业自动化、流程工业自动化和楼宇、交通、电力等其他工业自动化领域。串行现场总线主要用来连接数字现场设备或中、低功能的系统,如传感器、执行机构、变送器、可编程序控制器(PLC)、数控装置(NC)、编程设备、本地人机接口等。

qq_22560021的博客 4891

双向链表队列介绍

双向链表队列是一种结合了双向链表特性和队列特点的数据结构。在标准队列中,元素遵循先进先出(FIFO)原则,而双向链表允许在列表的前端或后端高效地插入和删除元素。将双向链表用于实现队列时,我们主要利用其双向遍历的能力,尽管在实际应用中,队列的典型操作(入队和出队)主要在一端进行,即在队列的尾部入队,在队列的头部出队。双向链表队列相比单向链表队列的优势在于,它提供了从队列两端快速访问的能力,这在某些算法或数据结构设计中非常有用。

MHD0815的博客 1500

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【数据结构】 队列(Queue)与队列的模拟实现

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有==先进先出FIFO(FirstIn First Out) ==入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front) 在Java中,Queue是个接口,底层是通过链表实现的。 队列在使用时有以下方法: 注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。使用如下: 运行结果如下: 队列中既然可

m0_71731682的博客 1612

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基础知识二、Python实现FIFO算法

在上一节中我们实现了双向链表DoubleLinkedList类,本节我们基于双向链表实现FIFO(先进先出)缓存置换算法。 文章目录一、FIFO实现二、测试逻辑测试结果 一、FIFO实现 代码逻辑很简单,就是遵循先进先出的原则,具体流程都写在注释中了。通过一个map来实现查找时的O(1)复杂度 class FIFOCache(object): def __init__(self, cap...

wang_xiaowang的博客 3711

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python利用双向链表和map实现FIFO算法

python利用双向链表和map实现FIFO算法 双向链表在之前: []: https://blog.youkuaiyun.com/weixin_41978134/article/details/106143560 """ @File : FIFO.py @Author: Gareth @Date : 2020/5/10 17:33 @Desc : FIFO算法 """ from Computer_Organization.node1 import DoubleLinkedList

Davecurry 424

Python实现页面置换算法(FIFO && LRU)

最近老师布置的操作系统实验,用Python实现了一下。下面是具体的数据结构,虽然是用C的思想描述,但区别不大。 1.算法中涉及的数据结构说明 如果采用C语言实现,本设计考虑使用C语言的结构体来描述页表结构和实页的使用情况。 页表结构如下: VirtualPage RealPage State EnterTime AccessTime 其中VirtualPage表示虚页号(因为共10个虚页,所以

qq_48520394的博客 2786

python版操作系统实验:FIFO和LRU页面置换算法

计算并输出下述各种算法在内存容量为3块、4块下的缺页率。(FIFO用的是数组,LRU用堆栈)1.先进先出的算法(FIFO);2.最近最少使用算法(LRU)。要求用计数器或堆栈方法实现。要求用数组或链表方法实现。

qq_60955696的博客 573

操作系统实验(四)---用python设计页面置换算法

先进先出页面置换算法(FIFO)和最近最久未使用页面置换算法(LRU)都是常见的页面置换算法。本文将介绍如何使用Python设计这两种算法,并通过测试数据验证它们的性能。先进先出页面置换算法采用“先进先出”的原则,即当需要置换页面时,选择最先进入内存的页面进行替换。以上代码中,我们使用一个长度为12的页面序列,并设置可用的页框数量为3。无论是否发生页面置换,都需要更新页面的访问时间戳。中,则按照上述算法选择最近最久未使用的页面进行替换,并将。,则弹出列表的第一个元素,以便为新页面腾出空间。

freedomvictor的博客 1462

python解析原理_Python语言之解析LRU算法原理

本篇文章主要讲述Python语言之解析LRU算法原理,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理。他将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在...

weixin_39533795的博客 214

双向链表实现队列

双向链表的结点包含前驱指针和后继指针,队列入队操作是在双向链表尾部添加元素,队列的出队操作是把双向链表的头结点删除,判断队列是否为空只要判断双向链表的头指针是否指向了NULL即可。 # include # include using namespace std; struct queueNode { int val; queueNode *pre; queueNode *next;

零丁若叹 3238

队列的链表实现(FIFO)

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;/** * Created by ZYQ on 2016/7/26. * 实现FIFO(先进先出)的队列 */ public class Queue<String> { private Node first

Godwin_YQ的博客 985

队列2-双向链表

YellowMax 1693

双向链表的实现

 双向链表实际上是单向链表的扩展。 当我们对单向链表进行操作的时候,有时你要对某个结点的前驱进行操作的时,又必须从表头开始查找。这是单向链表 结构特点的局限性。因为单链表每个结点只有一个存储直接后继的结点地址的链域,那么能不能定义一个既有存储前驱, 又能存储后继的这样一个链表结构呢?答案是可以的。这就是双向链表。 在双向链表中,结点除了含有数据域外,还有两个链域,“前驱后继”,有的人称之为左右链域,差不多,知道这么个意 思就可以了。其定义如下所示: struct RoleStruct {      int 

天蝎技术专栏 847

数据结构-双向链表

//注意双向链表中插入节点的顺序 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include &lt;stdbool.h&gt; // typedef struct _DNode { int data; struct _DNode* pre; //前驱指针 struct _DNode* next; //后继指针 }...

xiuxin121的博客 579
上一篇: Python中 a, b = b, a 的具体字节码实现? 以及会出现的问题!
下一篇: 详细讲解:Python中二进制以及数值的特殊性,在位运算中需要注意的点
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值