- 博客(18)
- 收藏
- 关注
原创 26版王道数据结构 章末思维拓展
可以假设待排序的数中最大的数为MAX_SIZE,那么开辟一个大小为这么大的数组nums,然后依次遍历每个待排序的数字x,都有nums[x] ++。王道书中提到的比较复杂的算法为Tarjan算法,其存储图的方式为邻接表,该算法的时间复杂度为O(V+E)。最后重新遍历一遍nums数组,数组中如果值不为0,那么代表原数组有这个数,数组值为几就代表有几个这样的数,依次输出即可。pop:主栈正常删除,如果删除的主栈元素与副栈相同,那么删除的元素为最小值,此时副栈也同时删除栈顶元素。摩尔投票法,即王道书中提到的方法。
2025-03-08 14:44:01
1580
原创 链表实现简单选择排序
因为简单选择排序不涉及边界问题,所以单链表带头结点或者不带头结点都可以,下面是不带头结点的实现。在找到最小值之后,交换两个结点的位置比较麻烦,所以可以直接交换两个结点的值即可。
2025-03-07 21:13:48
147
原创 链表实现冒泡排序
(3)q结点在指向下一个结点之前需要判断时候下一个结点为p结点,因为如果上一次发生交换的元素刚好是最后两个元素,那么交换完q结点就是最后一个结点,所以需要先判断再向后指。(1)从前向后遍历,那么每次都会在右侧确定一个值的位置,用结点p表示上次确定位置的元素的位置,那么下次遍历时只需要遍历该结点之前的元素即可。(2)使用bool遍历flag表示上一趟是否发生了元素交换,如果没有则表示已经有序。
2025-03-07 20:26:13
180
原创 链表实现直接插入排序
(2) 遍历待排序表,遍历每个结点的过程中在有序表中找到最后一个小于等于当前遍历结点的结点,然后将当前结点插入其后面。(1) 将表分为两个部分,一部分为有序表,一部分为待排序的无序表。因为单链表不能像顺序存储一样直接从后向前查找,所以有以下方法。思路:(使用带头结点的单链表可以避免一些边界问题)
2025-03-07 15:36:54
182
原创 非递归实现二叉排序树的插入
(2) 引入临时结点p用来遍历整棵树,当p结点遍历到NULL的时候说明当前的位置为新结点要插入的位置,由此再引入一个结点q作为p结点在遍历二叉树时的前驱节点,当p结点找到要插入的位置时q结点是他的父亲,此时通过比较新结点与q结点的大小选择插入其左/右子树即可。非递归实现二叉排序树的插入相对于递归版的来说优势为空间复杂度为O(1),但代码变得稍微复杂一些,不过实现的思路是相同的。(1) 如果要插入的树是一棵空树,那么就将当前的结点直接作为根节点返回即可。
2025-03-07 15:02:00
387
原创 DFS求逆拓扑排序(判别回路版)
那么只需要声明一个额外的bool数组st来判别当前的这个元素是否已经出现在函数调用栈中,如果是的话就代表有回路,然后退出函数。在输出一个结点之后要返回上一层函数,所以要在这个时候将这一层加进函数调用栈的结点给拿出来,即st[w]=false;递归会一直将调用的函数压入函数调用栈中,当一个元素在调用栈中第二次出现的时候就代表这个有向图中出现了回路。
2025-02-28 21:43:39
454
1
原创 邻接多重表的定义(数据结构)
对于无向图而言,其邻接多重表和邻接表的差别仅在于同一条边在邻接表中用两个结点,而在邻接多重表中只有一个结点。邻接多重表是无向图的一种链式存储结构。
2025-02-28 19:11:35
420
原创 26版王道第五章归纳总结例题
(10) 以先序次序输出一颗二叉树中所有结点的数据值及结点所在的层次。设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法。(8) 计算二叉树中各结点中的最大元素的值。(9) 交换二叉树中每个结点的两个子女。(1) 统计二叉树中度为1的结点个数。(2) 统计二叉树中度2的结点个数。(3) 统计二叉树中度0的结点个数。(7) 计算指定结点*p所在的层次。(6) 从二叉树山区所有叶结点。(4) 统计二叉树的高度。(5) 统计二叉树的宽度。
2025-02-23 22:53:35
247
原创 数据结构(c语言)-链栈的基本操作
26的王道书在链栈这一小节只有一个储存类型的描述,其余的操作都没有。并且结构体在定义时没有用指针的形式,个人感觉像之前链表的章节中用指针描述会更加方便一点。这里附上自己写的一些基本操作,如初始化,插入删除,进栈出栈,求栈长和栈顶元素。代码写的是带头结点的链栈。
2025-02-06 16:11:20
263
1
原创 数据结构(c语言)-双链表的基本操作(初始化,建立,插入和删除)
双链表建立的头插法和尾插法在王道书上只是写了跟单链表基本类似,但并没有给出具体的代码,在学习的时候写了一下。以及插入和删除提出的疑问,还有插入和删除时对末端问题的处理。
2025-02-02 16:10:54
146
原创 数据结构(c语言)-不带头结点的单链表的查找,插入,删除和头/尾插法
在复习26考研王道数据结构单链表这一节时发现课中多次让思考不带头结点的单链表的一些操作,包括插入删除,头/尾插法和链表倒置等,但是并没有给出相关的代码示例,所以自己写了一些,如果有不对的地方欢迎纠正。
2025-01-22 18:04:45
201
1
原创 时间复杂度的计算
大O表示法的写法为O( ),括号内为这个算法的时间量级,该方法为一个估算,并不是一个准确的执行次数。根据定义我们可以知道,找到某条基本语句与问题规模之间的数学表达式,就是找到了该算法的时间复杂度。而cnt是一条基本的执行语句,其执行次数与我们的问题规模有关,所以对于我们的大O表示法,其时间复杂度即为O(大O的表示法的好处是去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。在实际问题中我们一般关注的是最坏的运行情况,所以以最坏情况的时间复杂度为准。算法中的基本操作的执行次数,就是算法的时间复杂度。
2023-10-09 22:07:06
205
1
原创 动态规划解决最大子序和
动态规划(),又叫做dp,是一种用于解决一类最优化问题的算法思想,简单来说,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结果来推导出来,为了避免重复计算,必须把每个阶段的计算结果保存下来,方便下次直接使用。这也是动态规划和分治法的一个很大的区别,就是说动态规划分解出来的子问题间不是独立的,可能存在相互关联,而分治法分解出来的子问题间就是相互独立的,互不影响。而且要注意一定要能写出一个状态转移方程才能使用动态规划来解决。
2023-09-05 19:31:19
169
原创 贪心算法解决排队问题
贪心算法(Greedy Algorithm),又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。因为我们要让时间短的人先接水,所以我们要对数据进行排序,我们可以使用algorithm库中的sort函数,时间复杂度为O(nlogn)。安排他们的打水顺序才能使所有人的等待时间之和最小,则需要将打水时间最短的人先打水。输出一个整数,表示最小的等待时间之和。
2023-08-01 20:22:06
608
原创 分治思想--快速选择算法解决最小的k个数(TopK问题)
最简单粗暴的做法就是直接使用快速排序来解决这个问题,先对原数组进行排序,再 返回倒数第k个的位置,快速排序的时间复杂度为O(nlogn),但其实可以通过对其过程中进 行优化,是的算法的速度更快。到达边界条件后递归,此时l = 4,j = 4,此时寻找目标在左部分子数组, 所以对左部分子数组进行递归,又l = r,所以递归结束,输出结果。如果每次规模为n的问题都划分成1和n - 1,每次集合又向n -1。
2023-07-25 17:49:22
1292
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅