数据结构与算法
文章平均质量分 62
在这个专栏中,我们将深入探讨各种常见的数据结构,如数组、链表、栈、队列、树、图等,并学习它们的特点、操作和应用场景。同时,我们还将研究各种常见的算法,如排序、搜索、图算法、动态规划等,并了解它们的原理、复杂度分析和优化方法。
秋说
聚焦全栈开发与网络安全实战 | 欢迎订阅优质付费专栏,专注打造「新手能看懂、学完能实战」的全栈技术教程。商务合作/项目与毕设指导/产品推广/技术支持,可私信沟通。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
票务系统余票裂变算法深度解析与性能优化
本文系统解析了票务系统中核心的余票裂变算法,从业务背景出发,深入剖析了其数学模型、核心原理与经典实现方案。文章详细阐述了余票裂变算法在处理座位资源分配、订单并发冲突、超售风险控制等关键问题上的技术机制,重点探讨了高并发场景下的性能挑战与优化策略,包括分布式锁优化、缓存分层设计、预计算与异步处理等技术手段。原创 2026-05-08 15:03:47 · 381 阅读 · 0 评论 -
Paxos共识算法原理及其在分布式系统高可用性保障中的应用剖析
本文介绍Paxos共识算法作为分布式系统领域的一种经典一致性协议,其核心在于解决多节点环境下达成共识的难题。Paxos通过Proposer、Acceptor和Learner等角色协作,实现对提案的提议、接受和学习过程,确保即使在部分节点故障或网络分区的情况下,系统仍能维持数据一致性和可用性。原创 2026-01-20 15:40:33 · 1026 阅读 · 0 评论 -
Actor模型:并发编程的通信范式
本文介绍Actor模型作为并发编程的核心范式,详细阐述其定义、消息传递原理,以及在Scala Akka框架中的实现,包括ActorSystem、监督策略和分布式扩展。文章通过实践案例如聊天系统和金融交易,展示其应用优势,并分析常见误区如同步滥用和状态膨胀,提供解决方案。附加代码示例演示消息处理机制,帮助读者理解其在高并发场景下的实际价值。原创 2026-01-13 18:40:04 · 784 阅读 · 0 评论 -
Bloom Filter:高效的空间优化数据结构及其在现代系统中的应用
本文介绍Bloom Filter的工作原理及其在计算机系统中的应用。Bloom Filter是一种概率性数据结构,利用位数组和多个哈希函数实现高效的元素成员查询。它确保零假阴性率,但可能产生假阳性。通过数学公式优化参数,可最小化错误率。在实践案例中,如Redis缓存和Cassandra数据库,Bloom Filter有效预防缓存穿透和减少I/O开销。文章还讨论常见误区,如哈希选择不当和删除不支持,并提供解决方案,包括转向Counting Bloom Filter。原创 2026-01-12 11:34:07 · 1251 阅读 · 0 评论 -
红黑树:平衡二叉搜索树的典范及其在现代计算中的应用
本文介绍红黑树的定义、性质及其在计算机科学中的应用,重点剖析了插入操作的实现过程,包括平衡维护机制。通过实践案例,如电商库存管理和Linux进程调度,展示了红黑树的实际价值。同时,讨论了常见误区及其解决方案,提供伪代码示例以供参考。该文旨在为技术从业者提供从理论到实践的全面指导,帮助优化数据结构选择。原创 2026-01-09 11:27:34 · 964 阅读 · 0 评论 -
LRU缓存淘汰算法:原理剖析与高效实现策略
本文介绍LRU(Least Recently Used)缓存淘汰算法的原理与高效实现策略。首先,阐述算法的核心思想,即基于访问时间序列优先淘汰最久未使用数据,以提升缓存命中率。接着,剖析实现机制,强调哈希表与双向链表的结合实现O(1)操作复杂度,并提供Java代码示例。随后,通过电商平台和操作系统页面置换等实践案例,说明其应用价值。文章还讨论常见误区如缓存污染和高并发瓶颈,并提出解决方案如ARC算法和分段锁定。最后,总结LRU在现代系统中的重要性,强调其在性能优化中的作用。原创 2026-01-04 10:47:09 · 1108 阅读 · 0 评论 -
一致性哈希算法:原理剖析与分布式系统应用
本文介绍了一致性哈希算法的原理及其在分布式缓存系统中的应用。文章首先阐述了算法的核心机制,包括哈希环的构建、虚拟节点的引入以及数据映射规则。随后,通过Redis Cluster等实践案例,展示了其在电商场景下的落地,并提供了Java实现代码。文章还剖析了常见误区,如虚拟节点调优与哈希函数选择,并提出相应解决方案。总体而言,一致性哈希的优势在于最小化节点变化的影响,提升系统可用性,但需结合监控与优化策略以应对潜在挑战。原创 2026-01-04 10:40:46 · 840 阅读 · 0 评论 -
深度解析Redis跳表:原理、选型与实践——从面试题到技术落地
本文介绍了Redis有序集合(Sorted Set)底层核心数据结构跳表(Skip List)的技术原理与实践应用。首先构思了涵盖跳表原理、Redis选型、实践案例的核心面试题;随后从跳表的结构定义、层级生成规则入手,深入解析其查找、插入、删除操作流程及时间复杂度;对比跳表与红黑树的性能差异,阐明Redis选择跳表的核心原因;结合用户积分排行榜场景,提供带注释的Java代码案例说明技术落地;梳理常见误区并给出解决方案;最后总结跳表的技术价值与应用要点。原创 2025-12-29 11:29:44 · 855 阅读 · 0 评论 -
深度解析Linux CFS调度器:原理、实践与面试核心
本文以Linux CFS调度器为核心,围绕设计的技术面试题展开全面解析。首先明确了面试题及考察方向,随后介绍了CFS调度器的核心地位与发展背景。核心内容部分详细阐述了CFS“比例公平”的设计思想,以及虚拟运行时间计算、红黑树就绪队列管理、调度时机与抢占机制、优先级映射等关键实现细节。结合高并发Web服务器优化、嵌入式设备实时性优化两个实际场景,给出了具体的参数调整、调度策略设置及代码实现方案。同时,辨析了关于CFS公平性、nice值影响、实时性支持的常见误区并提供解决方案。原创 2025-12-24 12:13:33 · 938 阅读 · 0 评论 -
虚拟内存管理:操作系统中的核心机制与实践应用
本文介绍虚拟内存的概念、工作原理,以及页面置换算法与内存碎片处理的实践方法。通过剖析分页机制、TLB优化和常见算法如FIFO与LRU,结合Nginx服务器和KVM虚拟化的案例,阐述了其在提升系统性能与安全性的作用。文章还提供了C语言代码示例,模拟页表转换与故障处理,并讨论误区如页面抖动及解决方案如THP启用。该文适用于系统工程师,强调理论与工程的融合。原创 2025-12-18 13:22:02 · 789 阅读 · 0 评论 -
深入解析Raft一致性算法:原理、实践与面试核心
本文以“阐述Raft一致性算法的核心原理、应用场景及工程实践实现思路”为面试题,围绕Raft算法展开全面解析。首先介绍了分布式一致性的核心挑战及Raft算法的设计价值;接着详解其角色与任期基础设计,以及领导者选举、日志复制、安全性保障三大核心机制;然后以分布式键值存储系统为实践案例,给出基于Go语言的关键代码实现与运行流程;最后分析实践中常见误区及解决方案。本文旨在帮助开发者系统掌握Raft算法,兼顾理论深度与工程实践指导,为应对技术面试及实际开发提供支撑。原创 2025-12-17 11:10:22 · 887 阅读 · 0 评论 -
【数据结构 | C++】逆序对
对于给定的正整数序列a,如果 a[i]>a[j] 且 i < j 则 a[i]与a[j] 为一个逆序对。请问,对于给定的序列,有多少个逆序对?第一行一个正整数n(1原创 2024-12-04 10:47:37 · 1157 阅读 · 0 评论 -
【数据结构 | C++】完全二叉树的层序遍历
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。原创 2024-12-04 10:33:39 · 1283 阅读 · 2 评论 -
【数据结构 | C++】老板的作息表
题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干什么了?按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。原创 2024-12-04 10:30:39 · 1086 阅读 · 0 评论 -
【数据结构 | C++】盲盒包装流水线
每只盒子都有一个编号,小拼姐姐手里有进入流水线的空盒编号顺序表,也有每一批送往货栈的徽章顺序表,这样她其实可以知道每只盒子里装了哪种徽章。有些小朋友收到了盲盒,就想在拆封前问无所不知的小拼姐姐,盒子里的徽章是哪一种。但是因为盲盒总量有 10^5 这么多,小拼姐姐可记不住每只盒子里装的是什么,于是你就被请来写个程序帮小拼姐姐回复这种信息。众所周知,PAT 有 9 枚徽章,分别对应青铜、白银、黄金、白金、钻石、大师、王者、大圣、天神这 9 个段位,只有成绩非常优秀的考生才有资格获得刻有自己名字的徽章。原创 2024-12-04 10:26:56 · 1283 阅读 · 0 评论 -
【数据结构 | C】队列的实现及基本操作
输入第1行为1个正整数n,表示操作个数;接下来n行,每行表示一个操作,格式为1 d或0。1 d表示将整数d入队,0表示出队。n不超过20000。按顺序输出每次出队的元素,每个元素一行。若某出队操作不合法(如在队列空时出队),则对该操作输出invalid。给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。原创 2024-12-04 10:16:59 · 1377 阅读 · 0 评论 -
【数据结构 | C++】坐火车
输入格式:第一行给出两个整数n和m,代表城市的个数和铁路的数量。接下来m行,每行给出三个整数ui,vi,ti,表示第i条铁路连通城市ui和vi,花费的时间为ti。在某国,有个n城市,有m条铁路将这座城市连通,第i条铁路连通城市ui和vi,乘坐该条铁路的时间为ti。在城市i购买车票的排队时间为ai,现在小明想知道从城市到城市最少需要多久时间。从城市1乘坐第3条铁路,直接到达城市3,花费 + = 1 + 2 = 3。输出格式:输出一行,包含一个整数,表示从城市1到城市n的最小时间。原创 2024-11-26 09:03:53 · 1057 阅读 · 0 评论 -
【数据结构 | C++】Sins of a Solar EmpireP6
在某个星球上,该星球由n*m个方格组成,每个方格中可能为boss,s_sin(一个人),障碍,道路,小怪。假设s_sin可以秒杀boss和小怪,现在他的任务只需要到达boss所在的位置。如果s_sin想要到达某个方格,但方格中有小怪,那么必须打死小怪,才能到达这个方格。接下来n行,每行m个字符:“.”代表道路 , “a”代表boss , “r”代表s_sin ,“#”代表障碍,“x”代表小怪。输出格式: 如果s_sin能到达boss位置则输出所需的最少时间。计算s_sin到达boss位置至少需要多少时间。原创 2024-11-26 08:59:04 · 1064 阅读 · 0 评论 -
【数据结构 | C++】朋友圈
某学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请编写程序计算最大朋友圈中有多少人。输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数。第i个俱乐部的人数Mi(空格)学生1(空格)学生2 …输出给出一个整数,表示在最大朋友圈中有多少人。原创 2024-11-20 23:10:07 · 1758 阅读 · 1 评论 -
【数据结构 | C++】推断学生所属学校的人数
第一行是一个在[2, 1000]范围的整数N,接下来N行,每行是一个在现场的学生的姓名,每个姓名仅由字母组成,长度不超过30。某个比赛现场有来自不同学校的N名学生,给出M对“两人同属一所学校”的关系, 请推断学校数量,并找出人数最多的学校。在一行内分别输出学校的数量以及人数最多学校的人数,用一个空格分隔。然后是M行,每行是用空格间隔的两个人名,表示同属一所学校。接下来一行是非负整数M,表示有M对关系;原创 2024-11-20 23:08:54 · 1805 阅读 · 0 评论 -
【数据结构 | C++】并查操作
当 zi=2 时,输出xi与yi 是否在同一集合内,是的输出 Y;对于每一个zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。接下来 M 行,每行包含三个整数 zi,xi,yi。当 zi=1 时,将 xi与yi所在的集合合并。现在有一个并查集,你需要完成合并和查询操作。原创 2024-11-20 23:07:16 · 1847 阅读 · 0 评论 -
【数据结构 | C++】部落
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。原创 2024-11-20 23:05:14 · 1835 阅读 · 0 评论 -
【数据结构 | C++】朋友圈
朋友圈是由若干个人组成的集体,已知现在有n个人(1到n),然后给你m个关系xy,表示x和y是朋友,假设朋友的朋友也是朋友,求这n个人中最大的朋友圈人数。输入格式:第一行为正整数n,m。接下来有m行,每行有两个正整数 x 和 y,表示x和y是朋友。输出格式:输出n个人中最大的朋友圈人数。原创 2024-11-19 23:04:17 · 1126 阅读 · 0 评论 -
【数据结构 | C++】群聊chat
解释:用户1加入了群2,用户2未加群。如果他们想要交流的话,有两种方案:第一种是用户1再加入群1,用户2也加入群1,则两个用户总共加群2次;第二种是用户1不再加群,用户2加入群2,则两个用户总共加群1次。接下来n行,每行第一个整数为k_i (0≤k_i≤m),表示第i个用户所加入的群数量。现在给出每个用户已经加入的群列表,问这n个用户总共最少还需要再加多少次群,才能使得任意两个用户之间可以进行交流。第二个样例:用户1加入群2,用户8加入群4。输出格式:输出一个整数,表示这n个用户总共最少还需加群的次数。原创 2024-11-19 22:49:53 · 1046 阅读 · 0 评论 -
【数据结构 | C++】learning
接下来1行有n个整数,每个整数表示开始时每个学生的知识点;接下来k行,每行一个操作:每行包含1个数,每个操作表示对当前掌握知识点最少的学生进行辅导,学生掌握的知识点增加tadd。假设第 i(从1开始)个同学掌握的知识点为ti,而老师会不定期单独辅导掌握知识点最少的学生(若知识点相同则选编号最小的同学),学生掌握的知识点会增加tadd。经过若干次辅导后要求输出掌握知识点最少的学生的编号。输出格式:输出一个数,表示经过若干次辅导后掌握知识点最少的学生的编号。输入示例:5 2 \n 2 3 1 4 5。原创 2024-11-12 21:58:10 · 1064 阅读 · 0 评论 -
【数据结构 | C++】这条拉面好长
每一次切割花费的时间与这条的长度成正比,切割长度为 1 的拉面花费 1 单位时间。若拉面原长为 12 ,先将 12 切成 3+9 ,花费 12 单位时间,再将 9 切成 4+5 ,花费 9 单位时间,一共花费 21 单位时间;还可以先将 12 切成 4+8 ,花费 12 单位时间,再将 8 切成 3+5 ,花费 8 单位时间,一共花费 20 单位时间。显然,后者比前者更省时间。输入格式:第一行为一个整数N(2≤N≤150,000),在接下来的 N 行中,每行为一个整数 Li (1≤Li≤1000)。原创 2024-11-12 21:41:40 · 1076 阅读 · 0 评论 -
【数据结构 | C++】Windows消息队列
如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息连同表示此消息优先级高低的正整数(称为优先级值)加到队列当中。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。输入第 1 行给出正整数 n(≤10^5),随后 n 行,每行给出一个指令——GET 或 PUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是 PUT,后面就有一个消息名称、以及一个正整数表示消息的优先级,此数越小表示优先级越高。对于每个 GET 指令,在一行中输出消息队列中优先级最高的消息的名称和参数。原创 2024-11-12 16:52:10 · 1840 阅读 · 2 评论 -
【数据结构 | C++】小明的账单
先是一个非负整数 M≤100,表示当天收到的账单数,后跟 M 个正整数(都小于 1,000,000,000),表示每张帐单的面额。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单。输出共 N 行,每行两个用空格分隔的整数,分别表示当天支付的面额最小和最大的支票的面额。第 1 行:一个正整数 N(N≤15,000),表示小明补办银联卡总共的天数。请你帮他计算出支付的顺序。原创 2024-11-12 16:44:07 · 2323 阅读 · 0 评论 -
【数据结构 | C++】整型关键字的平方探测法散列
将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)=key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)+i^2)解决冲突。注意散列表的表长最好是个素数。如果输入给定的表长不是素数,你必须将表长重新定义为大于给定表长的最小素数。原创 2024-11-12 16:38:28 · 2177 阅读 · 0 评论 -
【数据结构 | C语言】构造散列表
设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时,使用增量序列di=5i。计算输入序列(值>=0)对应的散列地址值。(输入个数不会超过15个)按输入顺序输出其散列地址。每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格)第二行为对应的输入值,用空格隔开。原创 2024-11-12 16:31:35 · 1682 阅读 · 0 评论 -
【数据结构 | C++】集合相似度
给定两个整数集合,它们的相似度定义为:Nc/Nt×100%。其中 Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。计算任意一对给定集合的相似度。原创 2024-11-12 16:27:40 · 1570 阅读 · 0 评论 -
【数据结构 | C++】字符串关键字的散列映射
例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3×32^2+4×32+6=3206;然后根据表长得到3206%1009=179,即是该字符串的散列映射位置。给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。发生冲突时请用平方探测法解决。原创 2024-11-12 16:24:06 · 2272 阅读 · 0 评论 -
【数据结构 | C++】文件管理器
操作序列的格式为 op args,当op=1,即第一种操作时,args的格式为 folder name size,表示将在某个folder目录下添加文件名为name的文件,文件大小为size,如果文件名重复,则删除原来的文件再进行添加操作;注意:输出文件名以空格隔开,不输出多余的换行和空格。当op=3时,args的格式为 folder k,表示输出某个目录下文件大小最大至第k大的文件名,如果大小相同按文件名数字从小到大输出,如果不满k个文件只需要输出已有的文件名,如果文件夹为空或不存在则输出一个空行;原创 2024-11-08 16:15:58 · 1690 阅读 · 0 评论 -
【数据结构 | C++】order(树)
输入格式:输入第一行为一个正整数n表示二叉树的节点数目,节点编号从1到 n,其中 1 为根节点;第二行有n个数字,第i个数字表示i的父亲节点。(1的父亲节点为0,表示无);给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后。输出格式:输出两行,第一行为先序遍历,第二行为后序遍历。原创 2024-11-06 11:12:15 · 985 阅读 · 0 评论 -
【数据结构 | C++】不知道取什么好
有一个长度为n的序列,第i个数的大小为a[i]。现在从第1个数开始从左往右进行以下操作:如果当前数是剩下的数中最大的,则输出并删去这个数;若不是,将它放到序列的末尾。请问:一开始的第m(从1开始计数)个数第几次被输出。输入格式:第一行输入两个正整数 n(0原创 2024-11-05 22:04:13 · 1076 阅读 · 0 评论 -
【数据结构 | C++】数学家皮卡丘
皮卡丘想把这个数组分成k个非空的连续子数组,使得数组中的每个元素都包含且仅包含在一个子数组中。设max(i)为第i个子数组中的最大元素,min(i)为第i个子数组中的最小元素。例如对于数组[2,4,5,5,8,11,19],当给定k=3时应将其划分成3个子数组[2,4,5,5],[8,11],[19],此时皮卡丘可以得到最小值为(5-2)+(11-8)+(19-19)=6。输入格式:第一行包括两个正整数n和k,分别表示a数组的元素个数和应划分出的子数组个数k(1≤k≤n≤3e5)。原创 2024-11-05 18:07:50 · 1010 阅读 · 0 评论 -
【数据结构 | C++】老校长皮卡丘
N个精灵,每个精灵都有自己的初始技能值,每训练一次技能值加一。校长皮卡丘要求精灵们组队去打怪时必须两个精灵一队,并且队内两个精灵的技能值必须相等,这样才可以互相照应同时又不会拖累对方。皮卡丘校长想知道要将这N个精灵全部组队然后一起去打怪,它们一共所需最少的训练次数是多少?输入格式:第一行一个正整数 N(2原创 2024-11-05 18:06:10 · 1046 阅读 · 0 评论 -
【数据结构 | C++】量子统计
输入格式:第一行三个整数,分别为n,k,q(q原创 2024-11-05 16:31:54 · 1103 阅读 · 0 评论 -
【数据结构 | C++】索隆的难题
一本地图有N个城市,编号从1到N。每个城市有个代号,索隆每到一个城市只能知道该城市的代号而不知道该城市的编号,现有一份编号与代号对应的清单,请帮他找到所在城市的编号。输入格式: 第一行为两个正整数N (1< =N < =1000000),M(1原创 2024-11-05 14:32:42 · 1116 阅读 · 0 评论 -
【数据结构 | C++】优质的随从慕名而来
但他只能携带m个随从,当新买的随从无法加入队伍时,他只好卖掉队伍里之前最早买下的随从。当学长买下一个种类为x的随从时,若队伍里有另外两个随从种类也为x,他就凑成了一个“三连”。此时“三连”会将队伍中两个种类为x的随从移除,然后使买下的那个随从变为“金色”并加入队伍。每当学长获得“金色”随从时,学姐就会偷偷卖掉这个”金色“随从。输入格式:第一行包含两个正整数 n,m(1原创 2024-11-05 11:54:32 · 1008 阅读 · 0 评论
分享