数据结构与算法
文章平均质量分 77
在这个专栏中,我们将深入探讨各种常见的数据结构,如数组、链表、栈、队列、树、图等,并学习它们的特点、操作和应用场景。同时,我们还将研究各种常见的算法,如排序、搜索、图算法、动态规划等,并了解它们的原理、复杂度分析和优化方法。
秋说
优质专栏,欢迎订阅 1、网络安全新手快速入门(附漏洞挖掘案例) 2、BurpSuite入门教程(附实战图文) 3、CTF新手入门实战教程 4、网安渗透工具使用教程(全) | 商务合作、项目毕设、有偿解答可私信
展开
-
【数据结构 | PTA】二叉搜索树的结构
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。例如将{ 2 4 1 3 0 }插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;原创 2024-10-29 16:22:48 · 247 阅读 · 2 评论 -
【数据结构 | PTA】树的同构
输入给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数 n (≤10),即该树的结点数(此时假设结点从 0 到 n−1 编号);随后 n 行,第 i 行对应编号第 i 个结点,给出该结点中存储的 1 个英文大写字母、其左孩子结点的编号、右孩子结点的编号。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。如果两棵树是同构的,输出“Yes”,否则输出“No”。原创 2024-10-29 16:20:49 · 288 阅读 · 0 评论 -
【数据结构 | PTA】完全二叉树的层序遍历
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。原创 2024-10-29 16:17:55 · 690 阅读 · 0 评论 -
【数据结构 | PTA】根据后序和中序遍历输出前序遍历
第一行给出正整数 n (≤30),是树中结点的个数。随后两行,每行给出 n 个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。在一行中输出Preorder: 以及该树的前序遍历结果。数字间有1个空格,行末不得有多余空格。本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的前序遍历结果。原创 2024-10-29 16:16:13 · 207 阅读 · 0 评论 -
【数据结构 | PTA】字典合并
输入用字符串表示两个字典,输出合并后的字典。字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!“1” 的 ASCII 码为 49,大于 1,排序时 1 在前,“1” 在后。在一行中输出合并的字典,输出按字典序。在第一行中输入第一个字典字符串;在第二行中输入第二个字典字符串。在这里给出相应的输出。在这里给出相应的输出。在这里给出一组输入。在这里给出一组输入。原创 2024-10-29 15:55:20 · 174 阅读 · 0 评论 -
【数据结构 | PTA】与零交换
将 { 0, 1, 2, …, n−1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。输入在第一行给出正整数 n (≤10的5次方);随后一行给出{ 0, 1, 2, …, n−1 } 的一个排列。本题要求你找出将前 n 个非负整数的给定排列进行增序排序所需要的最少的与 0 交换的次数。在一行中输出将给定序列进行增序排序所需要的最少的与 0 交换的次数。原创 2024-10-29 16:13:27 · 256 阅读 · 0 评论 -
【数据结构 | PTA】懂蛇语
蛇语的规则是,在说一句话 A 时,首先提取 A 的每个字的首字母,然后把整句话替换为另一句话 B,B 中每个字的首字母与 A 中提取出的字母依次相同。输入第一行给出一个正整数 N(≤10的5次方),为蛇语词典中句子的个数。每句话由小写英文字母和空格组成,每个字的拼音由不超过 6 个小写英文字母组成,两个字的拼音之间用空格分隔。对每一句查询,在一行中输出其对应的句子。本题就请你写一个蛇语的自动翻译工具,将输入的蛇语转换为实际要表达的句子。注意:输出句子时,必须保持句中所有字符不变,包括空格。原创 2024-10-29 16:11:28 · 346 阅读 · 0 评论 -
【数据结构 | PTA】含茶量
本题就请你根据某社交网络中发帖的情况,统计每个人帖子中含有 ChatGPT(不区分大小写)的数量(简称“含茶量”),找出最热衷于讨论这个话题的人,即含茶量排前三的人。随后给出 N 条帖子的信息,每条格式为:第一行给出发帖人 ID,是一个长度不超过 10 位的非空数字串;第二行给出非空的帖子的内容,由不超过 140 个英文字母、数字、空格、标点(只包括?分三行输出含茶量最高的前三个 ID,及其含茶量。如果有含茶量的 ID 不到三个,那么有几个就输出几个,但含茶量为 0 的不要输出。题目保证至少有一个输出。原创 2024-10-29 16:09:46 · 255 阅读 · 0 评论 -
【数据结构 | PTA】是否同一棵二叉搜索树
然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。原创 2024-10-29 16:02:22 · 372 阅读 · 0 评论 -
【数据结构 | PTA】这是二叉搜索树吗?
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,原创 2024-10-29 15:59:07 · 490 阅读 · 0 评论 -
【数据结构 | PTA】排序
随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。原创 2024-10-08 20:12:33 · 820 阅读 · 0 评论 -
【数据结构 | PTA】队列
如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息连同表示此消息优先级高低的正整数(称为优先级值)加到队列当中。设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。原创 2024-10-08 20:09:12 · 1473 阅读 · 0 评论 -
【数据结构 | PTA】栈
例如给定 m=5、n=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。只盒子的编号,编号由 5 位数字组成,给出的顺序是空盒进入传送带的顺序。枚徽章的类型,为 1-9 的数字,给出的顺序是从进货口入栈的顺序。所有同行数字以空格间隔。原创 2024-10-08 20:05:35 · 1295 阅读 · 0 评论 -
【数据结构 | PTA】表
例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。原创 2024-10-08 19:59:42 · 984 阅读 · 0 评论 -
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
散列表(Hash Table),也被称为哈希表或散列映射,是一种常用的数据结构之一。它通过将键(key)映射到值(value)来实现高效的数据存储和检索。散列表的主要思想是利用哈希函数将键转换成对应的索引,然后将值存储在该索引位置上。当需要查找或插入元素时,再次使用哈希函数计算出对应的索引,从而快速定位到目标位置。散列表的优势在于具有高效的查找和插入操作。由于直接通过索引进行访问,时间复杂度通常为O(1),即常数时间装填原创 2023-12-24 09:31:42 · 2223 阅读 · 1 评论 -
【数据结构入门精讲 | 第十八篇】考研408、企业面试图专项练习(一)
在上一篇中我们学习了图的相关知识点,在这一篇中我们进行图的专项练习。选择两城市间最经济的航行路线用迪杰斯特拉算法(对)2从某顶点出发进行深度优先遍历,最先退出dfs过程的是拓扑序列的最后一个顶点。(对)3对任意一个图,从某顶点出发进行一次深度优先或广度优先遍历,可访问图的所有顶点。(错)若存在回路,则结束遍历,剩下的节点就不能被访问。4检查有向图是否存在回路的一种方法是使用无前驱顶点优先算法对有向图进行拓扑排序。( 对 )5邻接矩阵如下:原创 2023-12-24 09:31:19 · 2206 阅读 · 0 评论 -
【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正原创 2023-12-24 09:31:02 · 2088 阅读 · 0 评论 -
【数据结构入门精讲 | 第十七篇】一文讲清图及各类图算法
深度优先搜索(DFS)是一种用于遍历或搜索树、图等数据结构的基本算法。该算法从给定的起点开始,沿着一条路径直到达到最深的节点,然后再回溯到上一个节点,继续探索下一条路径,直到遍历完所有节点或者找到目标节点为止。具体步骤如下:标记起始节点为已访问。访问当前节点,并获取其所有邻居节点。 遍历所有邻居节点,如果该邻居节点未被访问过,则递归地对该邻居节点进行深度优先搜索。 重复步骤2和步骤3,直到所有能够到达的节点都被访问过。DFS算法使用了递归或者栈的机制,在每原创 2023-12-24 09:30:33 · 3334 阅读 · 21 评论 -
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
在许多实际应用场景中,我们需要对元素进行分组,并且在这些分组中进行查询和修改操作。比如,在图论中,我们需要将节点按照连通性进行分组,以便进行最小生成树、最短路径等算法;在计算机视觉中,我们需要将像素进行分组,以便进行图像分割和对象识别等任务。而并查集正是为了解决这些问题而被提出来的一种数据结构。原创 2023-12-23 20:07:02 · 2875 阅读 · 10 评论 -
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。输入格式:输入首先给出一个正整数N(≤105),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。原创 2023-12-23 20:06:41 · 2428 阅读 · 0 评论 -
【数据结构入门精讲 | 第二篇】考研408、企业面试基础概念习题
1.时间复杂度是根据算法写成的程序在执行时耗费时间的长度,往往与输入数据的规模有关。(对)2.斐波那契数列FN的定义为:F0=0, F1=1, F(N)=F(N−1)+F(N−2), N=2, 3, …用递归函数计算FN的空间复杂度是O(N)。(对)3.斐波那契数列FN的定义为:F0=0, F1=1, FN=FN−1+FN−2, N=2, 3, …。用循环函数计算FN的时间复杂度是Θ(FN).(错) 解析:在循环函数中,我们通过迭代的方式依次计算每个斐波那契数列原创 2023-12-23 20:06:18 · 2402 阅读 · 0 评论 -
【数据结构入门精讲 | 第四篇】考研408、企业面试表专项习题
在带哨兵结点的双循环链表中,设链结点的后继指针域为next,前驱指针域为prior,指针header指向哨兵结点,则判断该链表是否为空的表达式为:header->next==header 或 header->prior==header原创 2023-12-23 20:05:59 · 2408 阅读 · 0 评论 -
【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)
在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。输入格式:输入首先给出正整数N(≤104),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):路径和名称中的字符仅包括英文字母(区分大小写);符号“\”仅作为路径分隔符出现;目录以符号“\”结束;原创 2023-12-23 20:05:30 · 2504 阅读 · 0 评论 -
【数据结构入门精讲 | 第十二篇】考研408、公司面试树专项练习(一)
二叉排序树的性质:若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。原创 2023-12-23 20:05:08 · 2229 阅读 · 0 评论 -
【数据结构入门精讲 | 第十一篇】一文讲清树
树是一种非线性的数据结构,也是一种表示一对多关系的数据结构,它由若干个节点(Node)和连接这些节点的边(Edge)组成。树有很多应用,如用于实现文件系统、数据库索引和编译器等。下面是树的一些常见概念及其相关知识点:1.根节点(Root):树的最顶层节点,它没有父节点。2.叶子节点(Leaf):没有子节点的节点。3.父节点(Parent):如果一个节点有子节点,则该节点称为其子节点的父节点。4.子节点(Child):一个节点的直接后继节点称为其子节点。5.节点的度(Degree):一个节点拥有原创 2023-12-23 20:04:43 · 2384 阅读 · 4 评论 -
【数据结构入门精讲 | 第十篇】考研408排序算法专项练习(二)
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(原创 2023-12-23 20:03:11 · 2973 阅读 · 2 评论 -
【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)
1.希尔排序是稳定的算法。(错) 解析:稳定性是指如果两个元素在排序前后的相对顺序保持不变,那么这个排序算法就是稳定的。对于具有相同关键字的元素,排序后它们的相对位置应该保持不变。 2.仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。(对) 3.对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。(错) 答案:O(logN) 4.对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。(错)原创 2023-12-23 20:02:39 · 3721 阅读 · 0 评论 -
【数据结构入门精讲 | 第八篇】一文讲清全部排序算法(2)
冒泡排序、起泡排序O(n^2)比较次数:n*(n-1)/2稳定空间O(1)插入排序最优(有序)O(n)最坏(逆序)O(n^2)稳定空间O(1)希尔排序不稳定空间O(1)快速排序平均、最好O(nlong)最坏O(n^2)不稳定空间O(logn)桶排序O(n)稳定空间O(n)归并排序O(nlogn)归并趟数的数量级:O(logn)稳定空间O(n)堆排序O(nlogn)不稳定空间O(1)选择排序O(n^2)比较次数:O(n^2)原创 2023-12-23 20:02:07 · 2391 阅读 · 0 评论 -
【数据结构入门精讲 | 第七篇】一文讲清全部排序算法(1)
冒泡排序是一种简单的排序算法。它重复地比较相邻的两个元素,并将它们按照顺序交换,从而将最大(或最小)元素 “浮” 到数组的末尾。这个过程类似于气泡在水中上浮的过程,因而得名 “冒泡排序”。原创 2023-12-23 19:59:48 · 2157 阅读 · 2 评论 -
【数据结构入门精讲 | 第五篇】栈知识点及考研408、企业面试练习
栈是限定仅在栈顶(即表首)进行插入和删除操作的线性表,也称为后进先出(Last In First Out) 的线性表,简称 LIFO 结构。栈的内部实现原理其实就是数组或链表的操作,而之所以引入 栈 这个概念,是为了将程序设计问题模型化,利用栈的先进后出特性对特定的一些问题进行简化。(栈是线性表的特例)允许插入和删除元素的一端称为栈顶,另一端称为栈底,不含任何任何数据元素的栈称为空栈。原创 2023-12-23 19:59:32 · 2806 阅读 · 0 评论 -
【数据结构入门精讲 | 第六篇】队列知识点及考研408、企业面试练习
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。原创 2023-12-23 19:58:35 · 2822 阅读 · 0 评论 -
【数据结构入门精讲 | 第三篇】一文讲清表
由于单链表中最后一个元素所在的单元的指针为Null,当我们将其指向表首单元时,这个链表就变成了首尾相接的链表,即单循环链表,也就是说,从任意一个单元出发,可以找到任何其它的单元。图例如下:因此:含有尾指针单循环链表实现删除头节点和在尾节点后插入的操作效率最高。原创 2023-12-23 19:57:51 · 2272 阅读 · 0 评论 -
【数据结构入门精讲 | 第一篇】打开数据结构之门
数据结构与算法是计算机科学中的核心概念,也与现实生活如算法岗息息相关。鉴于全网数据结构文章良莠不齐且集成度不高,故开设本专栏,为初学者提供指引。原创 2023-12-23 19:57:30 · 2162 阅读 · 0 评论