期末大学老师题库及答案_第1页
期末大学老师题库及答案_第2页
期末大学老师题库及答案_第3页
期末大学老师题库及答案_第4页
期末大学老师题库及答案_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

期末大学老师题库及答案一、选择题(每题2分,共20分)1.在数据结构中,以下哪种数据结构是非线性结构?A.栈B.队列C.树D.数组2.以下哪种排序算法的平均时间复杂度为O(n²)?A.快速排序B.归并排序C.堆排序D.冒泡排序3.在操作系统中,进程的基本状态不包括以下哪一种?A.就绪状态B.运行状态C.等待状态D.终止状态4.TCP/IP协议栈中,负责端到端数据传输的协议是?A.IPB.TCPC.UDPD.HTTP5.在数据库系统中,以下哪种关系运算符用于选择满足条件的元组?A.选择B.投影C.连接D.并6.以下哪种数据结构适合实现LRU缓存淘汰算法?A.数组B.链表C.哈希表D.双向链表+哈希表7.在面向对象编程中,封装的主要目的是?A.提高代码执行效率B.隐藏对象的内部实现细节C.减少代码量D.增加代码可读性8.以下哪种算法用于解决最短路径问题?A.Dijkstra算法B.Kruskal算法C.Prim算法D.Floyd算法9.在操作系统中,死锁的必要条件不包括以下哪一项?A.互斥条件B.请求与保持条件C.非抢占条件D.循环等待条件E.可恢复条件10.在数据库设计中,第三范式(3NF)的主要要求是?A.消除非主属性对码的部分函数依赖B.消除非主属性对码的传递函数依赖C.消除任何函数依赖D.消除多值依赖二、填空题(每空1分,共20分)1.数据结构中,栈的特点是______,队列的特点是______。2.在算法分析中,时间复杂度O(nlogn)的排序算法有______和______。3.操作系统中,进程调度算法包括先来先服务(FCFS)、短作业优先(SJF)和______。4.TCP协议通过______机制来确保数据传输的可靠性。5.在关系数据库中,主键的作用是______,外键的作用是______。6.在哈希表中,处理冲突的方法有开放地址法和______。7.在面向对象编程中,继承的主要目的是______。8.图的遍历方法主要有深度优先搜索(DFS)和______。9.在操作系统中,虚拟内存技术的主要目的是______。10.在数据库系统中,事务的ACID特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和______。11.在算法设计中,分治法的基本思想是将问题分解为______的子问题。12.在计算机网络中,OSI参考模型共有______层。13.在数据结构中,红黑树是一种自平衡二叉搜索树,它通过节点着色和______操作来保持平衡。14.在数据库系统中,SQL语言中用于查询数据的命令是______。15.在操作系统中,文件系统的基本功能包括文件的创建、删除、读/写和______。三、判断题(每题1分,共10分)1.在数据结构中,数组的长度可以在程序运行时动态改变。()2.快速排序在最坏情况下的时间复杂度为O(n²)。()3.操作系统中的进程是程序的一次执行过程,具有动态性、并发性和独立性等特点。()4.UDP协议提供面向连接的数据传输服务。()5.在关系数据库中,一个关系模式可以对应多个关系实例。()6.二叉搜索树的中序遍历结果是升序排列的。()7.在面向对象编程中,多态是指一个对象可以有多种不同的形态。()8.Dijkstra算法可以处理带有负权边的图的最短路径问题。()9.在操作系统中,死锁可以通过剥夺资源、有序资源分配等方法预防。()10.在数据库系统中,视图是一个虚拟表,它基于一个或多个表的查询结果。()四、简答题(每题10分,共30分)1.请简述数据结构中栈和队列的区别,并分别列举一个应用场景。2.解释操作系统中进程与线程的区别,并说明为什么现代操作系统普遍采用多线程技术。3.简述TCP协议的三次握手过程,并说明为什么需要三次握手而不是两次。五、论述题(每题10分,共20分)1.论述数据库范式的重要性,并详细说明第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的定义及区别。2.论述操作系统中虚拟内存技术的原理、实现方式及其优缺点。六、编程题(共20分)1.实现一个LRU(最近最少使用)缓存机制,要求get和put操作的时间复杂度均为O(1)。请使用你熟悉的编程语言完成代码,并添加必要的注释。答案:一、选择题(每题2分,共20分)1.答案:C解释:栈、队列和数组都是线性结构,只有树是非线性结构。栈遵循后进先出(LIFO)原则,队列遵循先进先出(FIFO)原则,数组是相同类型元素的集合,它们都是线性排列的数据结构。而树是由节点和边组成的层次结构,是非线性结构。2.答案:D解释:快速排序、归并排序和堆排序的平均时间复杂度均为O(nlogn),而冒泡排序的平均时间复杂度为O(n²)。冒泡排序通过多次遍历列表,比较相邻元素并交换它们的位置,将较大的元素逐渐"冒泡"到列表的末尾。3.答案:D解释:进程的基本状态包括就绪状态、运行状态和等待状态(或称为阻塞状态)。终止状态不是进程的基本状态,而是进程执行结束后的状态。在就绪状态下,进程已获得除CPU外的所有所需资源,等待被调度;在运行状态下,进程正在CPU上执行;在等待状态下,进程因等待某个事件(如I/O操作完成)而暂时不能运行。4.答案:B解释:在TCP/IP协议栈中,IP协议负责网络层的数据包路由和转发,提供无连接的数据报服务;TCP协议提供面向连接的、可靠的端到端数据传输服务;UDP协议提供无连接的、不可靠的数据传输服务;HTTP协议是应用层的协议,用于超文本传输。因此,负责端到端数据传输的协议是TCP。5.答案:A解释:在关系数据库中,选择(Selection)运算符用于从关系中选取满足给定条件的元组;投影(Projection)运算符用于选取关系中的某些列;连接(Join)运算符用于将两个关系按照某种条件组合成一个新的关系;并(Union)运算符用于将两个具有相同模式的关系合并为一个关系。因此,用于选择满足条件的元组的关系运算符是选择。6.答案:D解释:LRU(LeastRecentlyUsed)缓存淘汰算法需要记录元素的使用顺序,最近使用的元素被保留,最久未使用的元素被淘汰。数组不适合实现LRU缓存,因为插入和删除操作的时间复杂度为O(n);链表虽然可以插入和删除,但查找操作的时间复杂度为O(n);哈希表可以提供O(1)的查找操作,但不维护顺序。因此,实现LRU缓存的最佳数据结构是双向链表+哈希表,哈希表用于快速访问节点,双向链表用于维护节点使用的顺序。7.答案:B解释:封装是面向对象编程的三大特性之一(封装、继承、多态),其主要目的是隐藏对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护对象内部数据不被非法访问和修改,提高代码的安全性和可维护性。提高代码执行效率不是封装的主要目的;减少代码量和增加代码可读性是封装可能带来的好处,但不是其主要目的。8.答案:A解释:Dijkstra算法是解决单源最短路径问题的经典算法,适用于没有负权边的图;Kruskal算法是解决最小生成树问题的算法;Prim算法也是解决最小生成树问题的算法;Floyd算法是解决多源最短路径问题的算法。因此,用于解决最短路径问题的是Dijkstra算法。9.答案:E解释:死锁发生的必要条件包括互斥条件(资源不能同时被多个进程使用)、请求与保持条件(进程因请求资源而阻塞时,对已获得的资源保持不放)、非抢占条件(资源不能被强制抢占)和循环等待条件(存在进程等待资源的循环链)。可恢复条件不是死锁的必要条件,而是指进程在释放资源后,可以重新从之前被中断的地方继续执行。10.答案:B解释:在数据库设计中,第一范式(1NF)要求关系中的每个属性都是原子性的,不可再分;第二范式(2NF)在满足1NF的基础上,要求非主属性完全函数依赖于主键,即消除非主属性对码的部分函数依赖;第三范式(3NF)在满足2NF的基础上,要求非主属性之间不存在传递函数依赖,即消除非主属性对码的传递函数依赖。因此,第三范式的主要要求是消除非主属性对码的传递函数依赖。二、填空题(每空1分,共20分)1.答案:后进先出(LIFO);先进先出(FIFO)解释:栈是一种后进先出(LIFO)的数据结构,最后入栈的元素最先出栈;队列是一种先进先出(FIFO)的数据结构,最先入队的元素最先出队。2.答案:快速排序;归并排序;堆排序解释:时间复杂度为O(nlogn)的常见排序算法包括快速排序、归并排序和堆排序。这些算法都采用了分治的思想,将问题分解为更小的子问题,然后合并子问题的解。3.答案:优先级调度解释:进程调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、多级队列调度和多级反馈队列调度等。优先级调度是根据进程的优先级进行调度,优先级高的进程优先获得CPU。4.答案:确认重传解释:TCP协议通过确认重传机制来确保数据传输的可靠性。发送方发送数据后,会启动一个计时器,如果在规定时间内没有收到接收方的确认,就会重新发送数据。5.答案:唯一标识关系中的元组;建立表与表之间的关联解释:在关系数据库中,主键是唯一标识关系中每个元组的属性或属性组,不能为空且值必须唯一;外键是引用另一个表主键的属性,用于建立表与表之间的关联,实现数据的参照完整性。6.答案:链地址法解释:在哈希表中,处理冲突的方法主要有开放地址法和链地址法。开放地址法是通过探测寻找下一个可用的槽位;链地址法是为每个哈希桶维护一个链表,所有冲突的元素都存储在对应的链表中。7.答案:代码复用和扩展解释:在面向对象编程中,继承允许一个类获取另一个类的属性和方法,从而实现代码复用和扩展。子类可以继承父类的特性,并添加或修改自己的特性,形成类的层次结构。8.答案:广度优先搜索(BFS)解释:图的遍历方法主要有深度优先搜索(DFS)和广度优先搜索(BFS)。DFS尽可能深地搜索图的分支,直到达到叶子节点,然后回溯;BFS逐层遍历图,先访问所有距离起始节点近的节点。9.答案:提高内存利用率和程序并发度解释:虚拟内存技术允许程序使用比物理内存更大的地址空间,通过将部分内存页交换到硬盘上,提高内存利用率和程序并发度。它使得每个程序都拥有独立的地址空间,提高了系统的安全性和稳定性。10.答案:持久性(Durability)解释:事务的ACID特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性确保事务要么完全执行,要么完全不执行;一致性确保事务执行前后数据库处于一致状态;隔离性确保并发执行的事务互不干扰;持久性确保一旦事务提交,其对数据库的修改就是永久性的。11.答案:规模较小且相互独立解释:分治法的基本思想是将一个难以直接解决的大问题分解为若干规模较小且相互独立的子问题,分别解决这些子问题,然后将子问题的解合并为原问题的解。这种方法常用于解决复杂问题,如排序、查找等。12.答案:七解释:OSI(开放系统互连)参考模型共有七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都有特定的功能,通过与其他层的协作完成网络通信。13.答案:旋转解释:红黑树是一种自平衡二叉搜索树,通过节点着色和旋转操作来保持平衡。旋转包括左旋和右旋,用于调整树的结构,保持红黑树的性质,如每个节点要么是红色,要么是黑色;根节点和叶子节点(空节点)是黑色;红色节点的子节点必须是黑色;从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。14.答案:SELECT解释:在SQL语言中,SELECT命令用于查询数据,可以从一个或多个表中检索数据。SELECT语句的基本语法包括SELECT子句(指定要检索的列)、FROM子句(指定要检索的表)和WHERE子句(指定检索条件)等。15.答案:维护解释:文件系统的基本功能包括文件的创建、删除、读/写、维护和检索等。维护功能包括文件的属性管理、权限管理、存储空间管理等,确保文件系统的正常运行和数据的安全性。三、判断题(每题1分,共10分)1.答案:×解释:在大多数编程语言中,数组的长度是固定的,在创建数组时确定,不能在程序运行时动态改变。如果需要动态改变集合的大小,应该使用动态数据结构,如列表或动态数组。2.答案:√解释:快速排序在最坏情况下的时间复杂度为O(n²),这种情况发生在每次划分操作都将数组划分为极不平衡的两部分,例如当数组已经有序或所有元素相等时。但在平均情况下,快速排序的时间复杂度为O(nlogn)。3.答案:√解释:进程是程序的一次执行过程,具有动态性(创建、执行、终止)、并发性(多个进程同时存在)和独立性(每个进程拥有独立的地址空间)等特点。操作系统通过进程管理来实现资源的分配和调度。4.答案:×解释:UDP协议提供无连接的数据传输服务,它不建立连接,也不保证数据的顺序和可靠性。而TCP协议提供面向连接的数据传输服务,在数据传输前需要建立连接,保证数据的顺序和可靠性。5.答案:√解释:在关系数据库中,一个关系模式(表的结构)可以对应多个关系实例(表的具体内容)。关系模式是静态的,定义了表的列名、数据类型等;关系实例是动态的,包含了表中的具体数据。6.答案:√解释:二叉搜索树是一种特殊的二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。因此,对二叉搜索树进行中序遍历(先遍历左子树,然后访问根节点,最后遍历右子树)会得到升序排列的结果。7.答案:√解释:多态是面向对象编程的三大特性之一(封装、继承、多态),指的是同一个操作作用于不同的对象,可以有不同的解释和执行结果。在编程中,多态通常通过方法重写和方法重载来实现,使得一个对象可以有多种不同的形态。8.答案:×解释:Dijkstra算法不能处理带有负权边的图的最短路径问题,因为它假设边的权值是非负的。如果图中存在负权边,Dijkstra算法可能会得到错误的结果。处理带有负权边的图的最短路径问题可以使用Bellman-Ford算法或SPFA算法。9.答案:√解释:在操作系统中,死锁可以通过多种方法预防和避免,包括剥夺资源(从一个进程中强行夺取资源分配给其他进程)、有序资源分配(规定资源的获取顺序,避免循环等待)、银行家算法(在资源分配前进行安全性检查)等。这些方法可以有效预防和避免死锁的发生。10.答案:√解释:在数据库系统中,视图是一个虚拟表,它基于一个或多个表的查询结果定义,并不实际存储数据。视图可以简化复杂的查询,隐藏数据的复杂性,提高数据的安全性。视图可以像表一样进行查询,但不能直接用于插入、更新和删除操作(某些情况下可以)。四、简答题(每题10分,共30分)1.答案:栈和队列是两种基本的数据结构,它们的主要区别在于操作规则和元素访问方式。栈的特点是后进先出(LIFO),即最后入栈的元素最先出栈。栈的主要操作包括入栈(push)和出栈(pop),只能在栈顶进行操作。栈的应用场景包括:函数调用栈(管理函数调用和返回)、表达式求值(处理运算符优先级)、括号匹配检查、浏览器的前进后退功能等。队列的特点是先进先出(FIFO),即最先入队的元素最先出队。队列的主要操作包括入队(enqueue)和出队(dequeue),入队在队尾进行,出队在队头进行。队列的应用场景包括:任务调度(操作系统中的进程调度)、消息队列(系统间通信)、广度优先搜索算法、打印任务队列等。栈和队列的主要区别在于元素的访问顺序:栈是后进先出,队列是先进先出。这使得它们适用于不同的应用场景,栈适合需要逆序处理的情况,队列适合需要顺序处理的情况。2.答案:进程与线程的主要区别:(1)资源分配:进程是资源分配的基本单位,拥有独立的地址空间和系统资源;线程是CPU调度的基本单位,共享所属进程的资源(如内存、文件等),但拥有独立的栈空间。(2)开销:创建、销毁和切换进程的开销较大,因为需要分配和回收资源;创建、销毁和切换线程的开销较小,因为共享资源。(3)并发性:进程之间的并发性受限于系统资源;线程之间的并发性更高,因为多个线程可以共享进程的资源。(4)健壮性:进程之间的隔离性较好,一个进程的崩溃不会影响其他进程;线程之间的隔离性较差,一个线程的错误可能导致整个进程崩溃。现代操作系统普遍采用多线程技术的原因:(1)提高资源利用率:多线程可以充分利用CPU资源,当一个线程因I/O操作阻塞时,其他线程可以继续执行。(2)提高响应速度:多线程可以同时处理多个任务,提高系统的响应速度,特别是在用户界面程序中,可以保持界面的响应性。(3)简化编程模型:多线程编程模型比多进程编程模型更简单,因为线程共享内存,数据交换更方便。(4)降低开销:与多进程相比,多线程的创建、销毁和切换开销更小,提高了系统的效率。(5)适合分布式系统:在分布式系统中,多线程可以同时处理多个客户端请求,提高系统的并发处理能力。3.答案:TCP协议的三次握手过程:(1)第一次握手:客户端发送一个SYN包(同步序列编号)到服务器,请求建立连接。客户端进入SYN_SENT状态,等待服务器的确认。(2)第二次握手:服务器收到SYN包后,发送一个SYN+ACK包作为响应。服务器进入SYN_RCVD状态,等待客户端的确认。(3)第三次握手:客户端收到SYN+ACK包后,发送一个ACK包作为确认。客户端和服务器都进入ESTABLISHED状态,连接建立成功。需要三次握手而不是两次的原因:(1)防止旧的重复连接初始化造成的混乱:在网络中,可能会出现延迟的SYN包,如果采用两次握手,服务器可能会认为这是一个新的连接请求,从而建立不必要的连接,浪费资源。三次握手可以确保双方都确认了连接的建立。(2)确保双方都具备收发能力:第一次握手确认客户端具有发送能力;第二次握手确认服务器具有发送能力和客户端具有接收能力;第三次握手确认服务器具有接收能力。这样确保了双方都具备收发能力,可以开始数据传输。(3)同步初始序列号:TCP协议需要为每个连接维护一个序列号,以确保数据的有序性和可靠性。三次握手可以同步双方的初始序列号,确保数据传输的正确性。因此,三次握手是TCP协议建立连接的必要过程,可以确保连接的可靠建立,避免不必要的资源浪费和数据混乱。五、论述题(每题10分,共20分)1.答案:数据库范式是关系数据库设计中的一系列规范,用于指导数据库设计,减少数据冗余,提高数据的一致性和完整性。范式的重要性主要体现在以下几个方面:(1)减少数据冗余:通过规范化,可以避免数据在多个表中重复存储,节省存储空间。(2)提高数据一致性:减少数据冗余可以降低数据不一致的风险,因为相同的数据只存储在一个地方。(3)提高数据完整性:通过规范化,可以更好地维护数据的完整性约束,如主键、外键等。(4)简化数据操作:规范化的数据库结构使得数据的插入、更新和删除操作更加简单和高效。(5)提高查询性能:虽然过度规范化可能会影响某些查询的性能,但合理的规范化可以提高整体查询性能。第一范式(1NF)、第二范式(2NF)和第三范式(3NF的定义及区别:第一范式(1NF):定义:关系模式中的每个属性都是原子性的,不可再分。每个属性的值都是不可分割的基本数据类型,如整数、字符串等。要求:关系中的每个属性都是原子的,不能有重复组或多值属性。特点:确保了数据的结构简单,避免了数据的嵌套和重复。应用场景:适用于基本的数据存储,通常作为范式化的起点。第二范式(2NF):定义:在满足1NF的基础上,关系模式中的非主属性完全函数依赖于主键,即消除非主属性对码的部分函数依赖。要求:关系模式必须满足1NF,并且非主属性不能部分依赖于主键。特点:解决了数据冗余和更新异常的问题,特别是当主键由多个属性组成时。应用场景:适用于具有复合主键的关系模式,可以减少数据冗余。第三范式(3NF):定义:在满足2NF的基础上,关系模式中的非主属性之间不存在传递函数依赖,即消除非主属性对码的传递函数依赖。要求:关系模式必须满足2NF,并且非主属性之间不能传递依赖于主键。特点:进一步减少了数据冗余,避免了插入、更新和删除异常。应用场景:适用于大多数关系数据库设计,是数据库设计的基本要求。区别:(1)依赖关系:1NF关注属性的原子性;2NF关注非主属性对主键的完全函数依赖;3NF关注非主属性之间不存在传递函数依赖。(2)解决的问题:1NF解决数据的结构问题;2NF解决部分函数依赖导致的数据冗余;3NF解决传递函数依赖导致的数据冗余。(3)规范化程度:1NF是最低的规范化级别;2NF比1NF更严格;3NF比2NF更严格。(4)应用场景:1NF适用于基本数据存储;2NF适用于复合主键的关系模式;3NF适用于大多数关系数据库设计。在实际数据库设计中,通常需要根据具体应用场景,在范式化和性能之间进行权衡,有时会采用反规范化设计,以提高查询性能。2.答案:虚拟内存技术的原理:虚拟内存技术是一种内存管理技术,它使得程序可以使用比物理内存更大的地址空间,通过将部分内存页交换到硬盘上,实现内存的扩展。虚拟内存技术的核心思想是:程序访问的地址是虚拟地址,需要通过内存管理单元(MMU)转换为物理地址。当程序访问的虚拟地址对应的物理页面不在内存中时,会触发缺页中断,操作系统将所需的页面从硬盘调入内存,如果内存已满,则会根据页面置换算法选择一个页面换出到硬盘。虚拟内存技术的实现方式:(1)分页机制:将虚拟地址空间和物理地址空间划分为固定大小的页面(通常为4KB)。虚拟地址由页号和页内偏移组成,通过页表转换为物理地址。(2)页表:用于存储虚拟页号到物理页号的映射关系,包括有效位、访问位、修改位等控制信息。(3)TLB(转换后备缓冲器):用于缓存页表项,加速虚拟地址到物理地址的转换。(4)页面置换算法:当内存不足时,选择合适的页面换出到硬盘,如LRU(最近最少使用)、FIFO(先进先出)等算法。(5)交换空间:硬盘上的一块区域,用于存放换出的内存页面。(6)缺页中断处理:当程序访问的页面不在内存中时,操作系统会触发缺页中断,进行页面调入操作。虚拟内存技术的优点:(1)扩展内存空间:使得程序可以使用比物理内存更大的地址空间,运行大型程序。(2)提高内存利用率:通过页面置换,可以更有效地利用有限的物理内存。(3)实现内存保护:通过页表中的权限位,可以实现不同进程之间的内存隔离,提高系统的安全性。(4)支持内存共享:多个进程可以共享相同的物理页面,节省内存空间。(5)简化编程模型:程序员可以不考虑物理内存的限制,专注于程序逻辑。虚拟内存技术的缺点:(1)性能开销:虚拟地址到物理地址的转换需要消耗CPU资源;缺页中断会导致程序暂停,影响性能。(2)实现复杂:虚拟内存技术的实现需要操作系统的支持,实现复杂度高。(3)硬盘依赖:当物理内存不足时,需要频繁访问硬盘,导致性能下降(称为颠簸现象)。(4)内存碎片:虚拟内存可能会导致内部碎片(页面内部未使用的空间)和外部碎片(内存中不连续的空闲空间)。(5)额外存储需求:需要额外的硬盘空间作为交换空间,增加了存储成本。在实际应用中,虚拟内存技术是现代操作系统的核心功能之一,它极大地提高了系统的灵活性和效率,但也带来了一定的性能开销。因此,在系统设计和优化时,需要合理配置虚拟内存参数,如页面大小、交换空间大小等,以平衡性能和资源使用。六、编程题(共20分)1.答案:```pythonclassLRUCache:def__init__(self,capacity):"""初始化LRU缓存:paramcapacity:缓存容量"""self.capacity=capacity缓存容量self.cache={}使用字典存储键值对self.order=[]使用列表维护键的访问顺序,最近访问的放在末尾defget(self,key):"""获取缓存中键对应的值:paramkey:键:return:值,如果键不存在返回-1"""ifkeyinself.cache:更新访问顺序:将键移到列表末尾self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key,value):"""向缓存中添加或更新键值对:paramkey:键:paramvalue:值"""ifkeyinself.cache:如果键已存在,更新值并调整访问顺序self.cache[key]=valueself.order.remove(key)self.order.append(key)else:如果缓存已满,移除最久未使用的键iflen(self.cache)>=self.capacity:oldest_key=self.order.pop(0)delself.cache[oldest_key]添加新的键值对self.cache[key]=valueself.order.append(key)测试代码if__name__=="__main__":创建容量为2的LRU缓存cache=LRUCache(2)测试put和get操作cache.put(1,1)cache.put(2,2)print(cache.get(1))输出:1cache.put(3,3)移除键2,因为缓存已满且键2是最久未使用的print(cache.get(2))输出:-1(未找到)print(cache.get(3))输出:3cache.put(4,4)移除键1,因为缓存已满且键1是最久未使用的print(cache.get(1))输出:-1(未找到)print(cache.get(3))输出:3print(cache.get(4))输出:4```另一种实现方式,使用双向链表和哈希表,可以达到更高的效率:```pythonclassDLinkedNode:def__init__(self,key=0,value=0):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity):"""初始化LRU缓存:paramcapacity:缓存容量"""self.capacity=capacityself.cache={}哈希表,存储键到节点的映射self.head=DLinkedNode()虚拟头节点self.tail=DLinkedNode()虚拟尾节点self.head.next=self.tailself.tail.prev=self.headdef_add_node(self,node):"""将节点添加到链表头部(表示最近使用):paramnode:要添加的节点"""node.prev=self.headnode.next=self.head.nextself.head.next.prev=nodeself.head.next=nodedef_remove_node(self,node):"""从链表中移除节点:paramnode:要移除的节点"""prev_node=node.prevnext_node=node.nextprev_node.next=next_nodenext_node.prev=prev_nodedef_move_to_head(self,node):"""将节点移动到链表头部(表示最近使用):paramnode:要移动的节点"""self._remove_node(node)self._add_node(node)def_pop_tail(self):"""移除链表尾部节点(表示最久未使用)并返回该节点:return:被移除的节点"""node=self.tail.prevself._remove_node(nod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论