王道数据结构和算法考研笔记
文章平均质量分 72
看星猩的柴狗
联系方式qq:3592569640 欢迎各位师傅交流学习
IT爱好者一枚,菜狗CTF-PWN手,记录自己的学习经历,请大佬多多指点
2022/9-2023/7:算法
2023/8-2023/9:web/渗透测试
2023/10-至今:pwn/C++开发
展开
-
数据结构和算法-交换排序中的冒泡排序(过程 代码实现 算法效率 稳定性 适用链表?)
将当前链表指针与其后面的指针的元素比较,如果当前的大于后面的,那么就交换。此时13已经交换到76的位置了,再比较97和13,小的在右边,交换。每趟都会从剩下的没确定位置的找到最小的排到之前已确定位置的元素后面。此时13交换到97的位置了,再比较65和13,小的在右边,交换。此时13交换到65的位置了,比较38和13,小的在右边,交换。此时13交换到38的位置了,比较49和13,小的在右边,交换。再比较13和27,此时小的依然在左边,符号。再比较76和13,此时小的在右边,交换。原创 2024-01-06 16:37:54 · 488 阅读 · 0 评论 -
数据结构和算法-交换排序中的快速排序(演示过程 算法实现 算法效率 稳定性)
此时进入第一次小循环,此时当high移动到与low相同才跳出第一次小循环,此时由于low=high,第二次小循环也会跳出,随后大循环条件不满足了,跳出大循环。此时移动low位置的值到high位置上去,此时回到大循环,发现low原创 2024-01-06 15:59:25 · 1034 阅读 · 0 评论 -
数据结构和算法-希尔排序(增量序列 算法实现 性能分析 稳定性)
对每个子表做插入排序时,开始直接从子表的第二个元素开始,此时第二个元素为d+1开始,遍历到n。然后对比,只不过都是按增量序列的差来对比对应位置。移动位置也需要按增量序列的差来移动。因为需要增量d来找到元素位置,用链表实现比较麻烦,所以仅适用于顺序表。最后找到大于的了,需要将此时比对的元素位置加上增量。不同增量序列,排序的趟数和每趟的比对次数不一样。此时子表就是整个表,对整个表开始插入排序。基本有序,就是存在有序的子序列。缩小增量,再除2,此时的子表。对各个子表分别进行插入排序。通过增量4得到各个子表。原创 2024-01-05 19:24:32 · 437 阅读 · 0 评论 -
数据结构和算法-插入排序(算法效率 折半优化 顺序表与链表插入排序 代码实现)
接着55小于60,low=mid+1,此时low大于high,此时low的元素大于55,而high的元素小于55。此时循环n次,每次将第i个元素与前i-1个元素比对,如果发现元素大于第i个元素就将该元素右移一位。0位置为前i-1个元素都要比对的元素,55发现大于mid,此时low=mid+1。此时76小于97,97移动位置,然后再与前面元素比对,发现大于,此时不动。49与之前比对,此时大于才移动,等于小于都不移动,这样保证稳定性。此时13最小,每次与之前元素比对都是小于,都会移动位置。原创 2024-01-05 17:29:02 · 746 阅读 · 0 评论 -
排序的基本概念(分类 应用 评价指标)
关键字可以相同。原创 2024-01-05 16:40:45 · 407 阅读 · 0 评论 -
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)
此时存84时,出现0次冲突,然后再次计算其对应的哈希表位置,出现1次冲突,再次计算,此时冲突,再次计算,此时不冲突,注意di都是从0开始的。此时直接定址法,如果由于关键字对应的位置也是连续的,所以如果关键字缺少,那么对应的位置的内容也会缺少。当出现关键字通过散列函数后对应一个位置时,该位置可存储一个链表,通过链表链接所有同义词,即出现同义词时,链接到链尾或链头。此时存1时,出现0次冲突,然后再次计算其对应的哈希表位置,出现1次冲突,再次计算,此时不冲突。冲突是指的同义词很多,都占一个位置了所以说冲突。原创 2024-01-03 12:27:00 · 1134 阅读 · 0 评论 -
数据结构和算法-算法的基本概念和时间复杂度和空间复杂度
算法就是处理的步骤。原创 2024-01-02 12:29:19 · 1127 阅读 · 0 评论 -
数据结构和算法-数据结构的基本概念和三要素和数据类型和抽象数据类型
数据结构即数据元素间的关系,当然可以是同属一类数据对象的,也可以属于不同类数据对象的。原创 2024-01-02 09:41:50 · 697 阅读 · 0 评论 -
数据结构和算法-B+树(性质 查找)
首先在根节点中比对关键字,如果该关键字大于要找得的关键字,那么去该关键字对应的子树,然后继续依次比对,发现9符合,到9对应得子树去。在9对应的子树中寻找,发现小于关键字8,由于此时是在叶子节点进行关键字比对,而发现小于,而未发现等于,此时认为没有找到。查找7,此时小于15,到15对应的子树去,再次找,发现小于9,去9对应的子树去找。首先比对左边第一个叶子节点内的关键字,发现没有,此时进入第二个叶子节点内的关键字。B+树节点的关键字个数和节点的子树个数一样。在9对于的子树去寻找,发现找到符合的关键字。原创 2024-01-01 15:42:01 · 894 阅读 · 0 评论 -
数据结构和算法-B树的插入和删除
此时73所在的节点的关键字个数少于小限,将其与双亲结点和兄弟节点合并,此时根节点为零个关键字,那么可以删除。此时插入88,插入到终端节点后,发现99溢出,再次按规则分开成树。此时插入90,从根节点依次查找,然后插入到终端节点的关键字中。插入同上,注意此时在终端节点插入要符合终端节点的大小顺序。直接删除关键字即可,然后注意终端节点的关键字个数是否合法。再次插入92,93,94,此时终端节点关键字个数溢出。再次插入73,74,75,插入后溢出。再插入80,此时溢出,再次分开成树。将77替代为删除的节点。原创 2023-12-31 14:03:31 · 661 阅读 · 0 评论 -
数据结构和算法-B树(B树的查找 B树的最大高度和最小高度)
所以高度为h的最高的B树,此时的叶子节点树最小就是图中等比得来的,最大得小于终端节点的关键字总数可以多到为此时等比得来得叶子节点的关键字的数模加上终端节点关键字数目,若等于,此时高度还可以增加了。此时假设此时h为最高的B树的高度,那么此时高度最高的B树的除终端节点的节点的关键字数目必须为最小节点关键字总数,终端节点的关键字数目可以大于等于节点最小关键字总数。所以此时关键字数目为n的对应的最高的高度为h的B树的叶子节点的关键字的数目一定是大于最高的高度为h的B树的叶子节点的最少数目(等比得来的)原创 2023-12-28 19:22:46 · 1638 阅读 · 0 评论 -
数据结构和算法-红黑树(定义 性质 查找 插入 删除)
插入和删除即一般不会破坏特性,并且即使破坏,恢复的代价比较低叶节点不是我们认为的没有子树的节点了,是空节点,即我们所认识的叶子节点的孩子就是叶节点。原创 2023-12-22 15:06:43 · 959 阅读 · 0 评论 -
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)
保存平衡查找长度小些。原创 2023-12-21 19:48:44 · 1601 阅读 · 0 评论 -
数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)
我们也可以用递归实现但递归的最坏情况可能需要有h个函数调用栈帧,或者说h个函数同时执行但循环的实现一直都是一个函数在执行。原创 2023-12-21 10:42:17 · 659 阅读 · 0 评论 -
数据结构和算法-查找的基本概念和顺序查找与折半查找与分块查找
这是因为之前mid和low与high的转换机制决定的,因为low的左边都是小于等于原来的mid,而原来的mid又是小于查找目标的。(当low大于high时,要不就是high=mid-1,要不就是low=mid+1,但此时low对应的都是刚好大于查找元素的)移动high为mid-1,计算mid,此时mid的值若为小数则向下取整,再次比较,此时查找目标大于mid对应的值。移动low为mid+1,更新mid,再次比较,此时要查找的值小于mid处对应的值。移动low为mid+1,计算mid,比较,此时大于。原创 2023-12-18 16:18:25 · 996 阅读 · 0 评论 -
数据结构和算法-AOV与AOE网络和(逆)拓扑排序与关键路径
然后开始出栈,知道栈为空,每出一个保存到print数组中,然后将出栈的点指向的顶点入度减1,并把入度为零的顺便压入栈中。所有活动的最迟发生时间需要通过活动的执行时间和所有事件的最迟发生时间来求。而所有事件的最迟发生事件并不等于所有活动的最迟发生时间。缩短到一定程度时,即再缩短也无法缩短整个工程的工期了。所有事件的最早发生时间就是所有活动的最早发生时间。当前网中不存在无前驱的顶点即存在回路。必须是DAG图(有向无环图)首先入度为0的点入栈。按关键路径从后往前推。原创 2023-12-17 16:49:19 · 610 阅读 · 0 评论 -
数据结构和算法-有向无环图描述表达式
每层才能合并,不同层有包含关系,不可能是相同的。就是任意两个点是否可以互相到对方就是有环图。原创 2023-12-17 15:12:59 · 385 阅读 · 0 评论 -
数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)
先找到最低代价的节点,每次将节点加入树后,需要更新各节点加入树的最低代价(即将原来的代价和个节点与加入节点的代价作比较)例如v2到v3是基于中转v1的,但是在以v2中转的转换中是把它认为是相连的。然后6号顶点出队,更新相邻节点,同时各个相邻节点入队。然后1号顶点出队,相邻节点入队,同时更新各相邻节点。首先访问2号顶点,然后再更新其相邻顶点后的结果。允许在v0 v1 v2 v3 v4中转。是已经基于之前v0 v1的中转结果的。允许在v0 v1 v2 v3中转。同一个图的最小生成树可能不唯一。原创 2023-12-17 14:33:34 · 1076 阅读 · 0 评论 -
数据结构和算法-图的基本操作以图的广度优先遍历和深度优先遍历
邻接矩阵设置 顶点中的一个变量为布尔型变量用来标记该顶点是否有效,当删除该节点时,只需将该节点所在行和列设置为0即可。访问后入队,然后出队后再将其相邻且没有访问的节点访问,然后再入队,然后再出队再将其相邻且没有访问的节点访问,如此反复。即每个结点最终都会进入一次深度优先遍历函数,这样才可能最终深度优先遍历所有节点。图遍历可能访问到原先的节点,但树不会,因为它是一直访问孩子节点的。邻接表即遍历所有边链表,将有顶点的边都删除,并修改对于的边链表。对于有向图的邻接表的入边时候需要将其他顶点的边链表都遍历。原创 2023-12-14 11:48:37 · 751 阅读 · 0 评论 -
数据结构和算法-图的基本概念及邻接矩阵法和邻接表法和十字链表法和链表链表法
顶点不能为空,边可以为空,且边对于两端必须要有顶点。原创 2023-12-11 17:27:40 · 1207 阅读 · 3 评论 -
数据结构和算法-并查集的实现及优化
Find操作两次循环第一次循环:找到根节点第二次循环:再次遍历查找根节点,将遍历到的节点的内容都更新为第一次循环找到的根节点通过这样,第二次Find时可以直接找到对应的根节点。原创 2023-12-04 15:34:19 · 497 阅读 · 0 评论 -
数据结构和算法-哈夫曼树以相关代码实现
一个含n个带权叶节点的二叉树对应形式有多种(左右也不是两种的形式),可自己去画画[ 题目 ] (1)哈夫曼树问题。(2)利用哈夫曼编码进行通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本,但是,这要求在发送端通过一个编码系统对待传数据进行预先编码;在接受端将传来的数据进行解码(复原)对于双工信道(即可以双向传输的信道),每端都要有一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编译码系统。原创 2023-12-03 23:10:49 · 476 阅读 · 0 评论 -
数据结构和算法-树与二叉树的存储结构以及树和二叉树和森林的遍历
先找到根,然后开始按对应的序遍历,如果左右中存在不是叶子节点,则将该节点当作根节点继续按对应的序来遍历。寻找某个节点的父节点时,需要遍历整个数,依次判断是否某个节点的子节点为对应的节点。对应的二叉树即对应的孩子兄弟法表示的树且该二叉树的先序遍历与原树的先根遍历相同。对应的二叉树即对应的孩子兄弟法表示的树且该二叉树的中序遍历与原树的后根遍历相同。通过计算出节点对应左孩子或右孩子的节点数然后判断是否在n个节点的范围内。所以B的右孩子的遍历下去的所有右孩子为原来A节点的孩子。存在指向孩子链表的指针的元素。原创 2023-12-03 11:35:11 · 986 阅读 · 0 评论 -
数据结构和算法-线索二叉树中的线索化和在线索二叉树中找前驱后继
当访问到某个节点时先看是否和目标节点一致,一致就保存在final指针中,不一致就更新将当前节点赋值给pre指针。然后依次访问下一个节点。原创 2023-12-03 10:28:15 · 632 阅读 · 0 评论 -
数据结构和算法-树和二叉树的定义和基本术语和性质
这里是先设高度最小为h则可以列出此时对应的节点数应该是大于前h-1层最多的节点数的,不然不可能还会有第h层嘛,然后此时n不可能比h层最多的节点数还多嘛,不然就有h+1层了,可以列出不等式,化简。有四层时,一二三四层的度数和相当于二三四层的节点数和(四层的度数和为零),但树的节点数还包括根节点,而一二三四层的度数和没有包括第一层的节点数,而第一层节点数为1。完全二叉树最多只有一个度为1的节点,如果有两个,则意味这两个度为1的节点的孩子之间相隔了一个节点,那么将不满足节点与对应的满二叉树节点一一对应的条件。原创 2023-11-27 21:28:42 · 642 阅读 · 0 评论