算法之美-06-链表

news/2025/3/12 22:16:31/文章来源:https://www.cnblogs.com/linxiaoki/p/18768714

线性表-链表

问题引入:
缓存大小有限,当缓存被用满时,需要决定哪些数据应该被清理或保留。
缓存淘汰策略:

  • FIFO(First In,First Out) 先进先出策略 (队列?
  • LFU(Least Frequently Used) 最少使用策略
  • LRU(Least Recently Used) 最近最少使用策略(链表)

链表与数组在存储结构上的对比:
数组需要一块连续的内存空间来存储,如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大小100MB时,仍然会申请失败。链表则是通过指针将一组零散的内存块串联起来使用,所以不会存在这个问题。

  • 数组占用连续内存空间,无法动态扩容,进行扩容时需进行申请更大空间、整体拷贝,所以更费时。而链表本身没有大小的限制,天然支持动态扩容。
  • 链表每个结点需要消耗额外的空间去存储一份指向下一个结点的指针,所以内存消耗会翻倍。(即空间换时间)
  • 链表在进行频繁的插入和删除操作时,导致频繁的内存申请释放,容易造成内存碎片,也导致频繁的GC(垃圾回收)

常见的链表结构:

  • 单链表:只有Next,尾结点指向Null
  • 双向链表:Next+Prev,尾结点指向NUll。与单链表相比,在删除结点时更快。(因为在删除某个结点q时,实际是修改其前驱结点的后继指针,而单链表需要遍历才能获取前驱结点。)=>空间换时间。
  • 循环链表:Next,尾结点指向头结点。与单链表相比,从链尾到链头更方便,更适合处理具有环形结构特点的数据(代码会更整洁)。

链表的基本概念:

  • 结点:链表通过指针将一组零散的内存块串联在一起。在这里面的内存块成为结点
  • 后继指针:记录链上下一结点的地址的指针称为后继指针
  • 头结点:链表的第一个结点,记录链表的基地址
  • 尾结点:链表的最后一个结点,指针指向空地址NULL
  • 结点的作用:存储数据;记录链上下一结点的地址。

-->data;next-->data;next-->data;next-->Null

实践

1. 使用循环链表解决“约瑟夫问题”。

约瑟夫问题:设编号为1、2、...n的n个人围坐在一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的哪个人出列。它的下一位又从1开始报数,数到m的那个人又出列。一次类推,直到所有人都出列为止,由此产生一个出列编号的序列。

2. 如何基于链表使用LRU缓存淘汰算法?

维护一个有序单链表,越靠近尾结点的数据表示越早之前访问。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。
0. 新数据被访问时,从链表头开始遍历链表

  1. 数据已经被缓存在链表中,通过遍历得到对应的结点,并将其从原来的删除,在插入到头节点;
  2. 如果未被缓存
    2.1 缓存未满,插入到头节点
    2.2 插入已满,删除尾结点,插入新的数据结点到头节点
    优化:使用散列表,记录每个数据的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC 入门

SpringMVC开发步骤 添加依赖<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://mave…

20241123实验一《python程序设计》实验报告

标题“20241123 实验一《Python程序设计》实验报告” 实验报告模板如下: 20241123 2025.3.12 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2411 姓名: 胡钧涛 学号:20241123 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.…

MySQL的limit优化2

一、底层原理 在 MySQL 8.0 中,当使用 LIMIT offset, count 进行分页查询时,如果 offset 非常大(例如 LIMIT 200000, 10),性能会显著下降。 这是因为 MySQL 需要扫描 offset + count 行数据,然后丢弃前 offset 行,只返回最后的 count 行 二、基本语法与功能LIMIT子句的基…

20242216 2024-2025-2 《Python程序设计》实验一报告

20242126 2024-2025-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级: 2421 姓名: 邹清楠 学号:20242126 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(第一次调试时的选…

今日总结(计网以及对Android Studio的进一步学习)

所花时间:130minutes 代码量(行):130 博客量:8 了解的知识点:今天学习了计网的信道复用技术以及对于前一节课的通信系统中涉及的计算问题的复习。 主要为码元与比特的关系,一个码元所携带的比特数 = 1og2x其中x为状态数,比如在计算 中会告诉你状态数,以及码元传输速率…

python公选实验一

20242113《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2421 姓名: 陈铂翔 学号:20242113 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并进行调试分…

20243303 实验一《python程序设计》实验报告

学号 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: XXXX 姓名: XXX 学号:XXX 实验教师:XXX 实验日期:2021年X月X日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并进行调试分析…

2024-2025-2 20244330《Python程序设计》实验一报告

2024-2025-2 20244330《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2443 姓名: 李馨逸 学号:20244330 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 (1)熟悉Python开发环境; (2)进行Python运行、调试技能的学习与练习; (3)编…

吴恩达深度学习Part1

What is a Neural Network? Easily,Deep Learning is a more complex Neural Network. We can predict the house prices from the size.Based on it,We can fit a function to predict house prices.But you may find it is strange that the prices can not be negative.So…

字符编码:从基础到乱码解决

本文从常见编译错误入手,剖析字符编码问题。系统介绍现代字符编码五层模型,以“汉”字为例解析各层作用。阐述ASCII、GB2312、Unicode等常见编码标准,对比其特点与适用场景。解释输入与执行字符集概念,强调不一致导致的问题。通过代码示例分析控制台输出中文乱码原因,提出…

20241110 实验一《Python程序设计》实验报告

20241110 2024-2025-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级: 2411 姓名: 王方俊 学号:20241110 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

20242125实验一《Python程序设计》实验报告

20242125 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2421 姓名: 单嘉怡 学号:20242125 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 一.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…