算法
文章平均质量分 80
之墨_
这个作者很懒,什么都没留下…
展开
-
算法基础模板 快排、快选、归并、二分、离散化、区间合并、链表、图搜索、最短路等
算法基础 快排、快选、归并、二分、离散化、区间合并、链表、图搜索、最短路等模板原创 2023-07-09 18:51:52 · 1077 阅读 · 0 评论 -
染色法判定二分图 — DFS深搜 +BFS宽搜
如果给定图是二分图,则输出 Yes,否则输出 No。条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。行,每行包含两个整数。原创 2023-07-08 16:55:37 · 507 阅读 · 0 评论 -
Dijkstra求最短路 — 朴素/堆优化 + 模拟邻接表 及 遍历
给定一个 n个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。原创 2023-07-07 22:17:04 · 446 阅读 · 0 评论 -
树的重心 — 模拟单链表实现树的存储+DFS搜索
给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。原创 2023-07-06 21:51:06 · 286 阅读 · 0 评论 -
算法导论【摊还分析】—聚合分析、核算法、势能法
假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时,第 i 个操作的代价为 i,否则代价为 1。次操作应该付的代价,故每个操作的摊还代价为。个操作为非2的幂,多付的代价为。所以每个操作的摊还时间代价为。个操作序号为2的幂,则。设每个操作的代价都为。原创 2023-02-19 20:45:13 · 713 阅读 · 0 评论 -
算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘
在分而治之的方法中,一个问题被划分为较小的问题,然后较小的问题被独立地解决,最后较小问题的解决方案被组合成一个大问题的解决。分解:将问题划分为若干子问题,这些子问题是同一问题的较小实例。解决:通过递归地解决子问题来征服它们。如果它们足够小,则将子问题作为基本情况解决。合并:将子问题的解决方案合并为原始问题的解决方法。原创 2023-02-19 19:36:04 · 2048 阅读 · 0 评论 -
算法导论【贪心算法】—排队等待问题、单位时间的调度问题、0-1背包贪心近似、多机调度问题
每次选择一个处理时间最小的人排队,选择后只剩一个子问题:为剩余的人找一个排队次序,使每个人排队时间总和最小,此问题存在一个最优解,即贪心选择是安全的。本题的贪心算法为:N 个数据从小到大排序,就是这 N 个人的最佳排序方案。从而新的序列比原最优解序列好,矛盾!故贪心选择可以得到最优解。之前的人等待时间都减少了。原创 2023-02-19 14:15:35 · 1455 阅读 · 0 评论 -
算法导论【时间复杂度】—排序算法、图算法、动态规划、字符串匹配等时间复杂度小结
时间复杂度。改进快速排序,如果每次划分取得基准元素都是最大或者最小的元素,那么排序会退化至==O(n^2^)==- 如何改进? 1. 避免最坏的情况,使用数组中的一个随机元素作为划分元素,这样出现最坏情况的几率就会相对很小 2. 取出数组的左边元素,中间元素和右边元素,然后对这三个元素进行排序,然后以中间的元素作为基准值key原创 2023-02-19 10:54:37 · 1512 阅读 · 0 评论 -
算法导论【字符串匹配】—朴素算法、Rabin-Karp、有限自动机、KMP
算法导论【字符串匹配】—朴素算法、Rabin-Karp、有限自动机、KMP关键在于计算出前缀π数组,π就是文本串中在该位置能够得到最长的前后缀长度,举个例子:预处理过程:原创 2023-02-18 17:33:28 · 987 阅读 · 0 评论 -
算法导论【在线算法】—The Ski-Rental Problem、The Lost Cow Problem、The Secretary Problem
算法导论—在线算法:如果在这个距离内找到了宝藏则结束寻找,没找到则寻找距离翻倍,切换至寻找下一条路径,路径编号对。 最坏的情况是,发现宝藏的距离比上次在这条路上搜索的距离稍远一点点,因此,最优解为。取模,保证每次寻找的路径都是合法的,直到找到宝藏。次后再也不滑雪,那么在线算法的总费用为。,从第一条路开始寻找,初始寻找距离为。的情况下实施我们的策略,我们将以至少。的概率成功雇佣我们最合格的申请人。,而离线算法取得的最优解为。,我们选择在滑雪次数。,则我们说这个策略是。The Ski-原创 2023-02-18 17:22:11 · 1337 阅读 · 0 评论 -
算法导论【近似算法】—0-1背包问题的近似算法
若对于每一个固定的ϵ0ϵ > 0ϵ0,算法 A 的运行时间以实例III的规模的多项式为上界,则称 A 是一个多项时间近似方案。在 PTAS 的基础上,进一步要求算法 A 的运行时间以实例III的规模和1ϵ1 / ϵ1/ϵ的多项式为上界,则称 A 是一个完全多项时间近似方案。FPTAS 被认为是最值得研究的近似算法,仅有极少数的 NP-hard 问题存在 FPTAS。原创 2023-02-15 21:09:11 · 3156 阅读 · 0 评论 -
算法导论【排序算法】—选择排序、快速排序、插入排序等经典八大算法稳定性分析
排序前后两个相等的数相对位置不变,则算法稳定。稳定性优点:从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。原创 2023-02-15 10:59:11 · 1136 阅读 · 0 评论 -
算法导论【图算法】—最小生成树、最短路径、最大流算法总结
Dijkstra算法- 顶点为V,边为E的图 1. 对每条边仅松弛1次 2. 边权不可为负 3. 运行过程维护一组结点集合S 4. 使用贪心策略,每次选择集合V-S中最“近”的结点加入集合S 5. 利用结点编号维持最小优先队列,时间复杂度为:原创 2023-02-09 21:34:35 · 1402 阅读 · 0 评论 -
算法导论—分治法思想、动态规划思想、贪心思想
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。与分治法最大的区别是:适用于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上)原创 2023-02-09 21:33:01 · 991 阅读 · 1 评论 -
算法导论—近似算法
近似算法的性能分析包括时间复杂度分析、空间复杂度分析和近似精度分析,其中时间(空间)复杂度的分析同精确复杂度相同。近似精度分析是近似算法特有的,它主要用于刻画近似算法给出的近似解相比于问题优化解的优劣程度。其中n是输入大小,C是A产生的解的代价,C*是优化解的代价。近似算法的性能比不会小于1,一个能求得精准最优解的算法性能比为1,一般情况下性能比大于1.近似算法的性能比越大,它求得的近似最优解越差。设A是一个优化问题的近似算法,A具有近似比(ratio bound) p(n), 如果。原创 2023-02-09 20:37:23 · 1237 阅读 · 0 评论 -
算法导论—SAT、NP、NPC、NP-Hard问题
给定布尔 (Boolean) 表达式 (由 AND, OR, NOT, 变量, 和括号构成), 是否存在对变量 TRUE 或 FALSE 的赋值, 使得整个表达式真。SAT 问题 (Propositional satisfiability problem, 命题可满足问题, SAT):给定命题逻辑公式 (propositional formula), 是否可满足 (存在一个模型)。原创 2023-02-09 20:08:14 · 3647 阅读 · 0 评论 -
算法导论第26章、32章习题—最大流的更新、字符串匹配
是一个源结点为 s 汇结点为 t 的流网络,其容量全部为整数值。假定我们已经给定 G 的一个最大流。(提示: 将问题转化为多项式相乘问题,多项式相乘可通过 FFT 算法获得。的容量增加 1 个单位,请给出一个。的容量减少 1 个单位,请给出一个。对应的字符串匹配自动机的状态转换图。时间的算法来对最大流进行更新。时间的算法来对最大流进行更新。,但必须取代一个字符。可以匹配任意单个字符,即。(DNA 链匹配问题),a. 给出时间复杂度为。b. 考虑增大字符种类,字符,而 P 中包含。(最大流的更新) 设。原创 2022-12-12 00:27:34 · 870 阅读 · 0 评论 -
算法导论第24、25章习题—最小生成树、单源最短路、所有节点对最短路
使用Dijkstra算法解决加权有向图中的多起点最短路径问题,其中边的权重均为正:给定一组起点,找到相应的最短路径森林并实现一个方法为用例返回从任意起点到达每个顶点的最短路径。原创 2022-12-08 16:00:00 · 764 阅读 · 0 评论 -
算法导论24章单源最短路径—Bellman-Ford算法 Dijkstra算法
松弛操作就是判断从现在s到v的路径更近,还是我从s到u再到v更近,选一个更近的走。第一个循环,循环V-1次,每次循环对所有的边都松弛一次,所以最终每条边都松弛了V-1次最后对每条边再判断一下,如果每条路径都已经是最短了,就不会再出现从s到u到v比s到v更短的情况,因为前面的松弛就已经找出了这种情况,V-1次已经可以保证把所有可能都找完,而现在又出现这种情况,说明存在负环,只有存在负环才可以无限的把路径长度减小Dijkstra算法与Prim算法很像,Dijkstra算法是BFS的升级版,若要求最短原创 2022-12-03 23:28:00 · 377 阅读 · 0 评论 -
算法导论23章最小生成树习题—23.2练习
23.2-1对于同一个输人图,Kruskal 算法返回的最小生成树可以不同。这种不同来源于对边进行排序时,对权重相同的边进行的不同处理。证明:对于图G的每棵最小生成树T,都存在一种办法来对G的边进行排序,使得Kruskal算法所返回的最小生成树就是T。假设我们想选择 T 作为最小生成树。然后,为了使用 Kruskal 算法获得此树,我们将首先按边的权重对边进行排序,然后通过选取包含在最小生成树中的一条边来解决边权重中的连接,并将所有不在T中的边权视为稍大,即使它们具有相同的实际权重。 通过这种排序,我们能够原创 2022-12-03 15:23:39 · 2016 阅读 · 0 评论 -
算法导论【多源最短路径】—Floyd算法
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离。与迪杰斯特拉算法区别:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径; 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的原创 2022-12-01 15:06:28 · 679 阅读 · 0 评论 -
算法导论习题—摊还时间代价分析、栈实现队列、贪心算法近似比、集合覆盖问题
每次有元素入左栈时,判断辅助栈为空或辅助栈的栈顶元素比入栈元素更大,则将该元素压入辅助栈中,否则将辅助栈的栈顶元素重复压入辅助栈。左栈需要弹出元素时,辅助栈需要同步弹出栈顶元素。取最小值时,直接将栈顶元素弹出,返回值即最小值。 当我们选择一个集合之后,删除已经被覆盖的元素。每次迭代添加包含未覆盖元素最多的集合, 直到满足全覆盖条件,时间复杂度为多项式时间。: 使用聚合法分析,取最小值实际上是对单个辅助栈的操作,考虑整个栈的。个操作,一个对象压入栈后,至多弹出一次,则对该栈的。是其覆盖的对应元素个数。原创 2022-11-24 15:59:49 · 460 阅读 · 0 评论 -
算法导论第15、16章习题—动态规划、贪心算法
设计一个高效的算法,对实数线上给定的一个点集$\{x1, x2,... xn\}$, 求一个单位长度闭区间的集合,包含所有给定的点,并要求此集合最小。 证明你的算法是正确的。对给定的点集先按升序排序,然后从最小点$x$的开始,构建单位闭区间 $[x, x + 1]$,再将在此区间中的所有数删除,重复此方法构建闭区间,直至点集为空,此时所有闭区间构成的集合就是满足要求的最小集合。原创 2022-11-09 19:39:58 · 1174 阅读 · 0 评论 -
算法基础OJ(22-E2-4)—危险品放置
我们用危险系数αi,j表示危险品i,j放置在一起的危险程度。一些危险品即使放置在一起也不会产生任何危险,此时αi,j=0,还有一些危险品即使单独放置也会产生危险,此时αi,i>0。定义两个仓库整体的危险系数为max(maxi,j∈Aαi,j,maxi,j∈Bαi,j),即放置在一起的所有危险品两两组合的危险系数的最大值。接下来的m行,每行三个整数i,j,αij表示(i,j)为危险组合(i,j可能相等),其危险系数为αi,j>0。输出共一行,包含一个整数,表示整体危险系数的最小值。原创 2022-11-07 00:00:00 · 121 阅读 · 0 评论 -
算法基础习题—内存分配(区间树实现)
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。现在小明决定实现一个类似malloc的内存分配系统,具体来说,他需要连续处理若干申请内存的请求,这个请求用一个闭区间$[a_i..b_i]$来表示。当这个区间和当前已被申请的内存产生重叠时,则返回内存分配失败的信息。假设初始状态下内存均未被占用,管理的内存地址范围为$0-1GB(0-2^{30})$。对于每行内存分配的申请,若申请成功则输出一行0,若申请失败则输出一行-1。行数据,每行的格式为。原创 2022-11-04 21:19:04 · 349 阅读 · 0 评论 -
算法基础实验OJ—树的遍历
给定某二叉树的前序序列和中序序列,输出该二叉树的后序序列。(输入的前序遍历和中序遍历的结果中都不含重复的数字)第一行是n接下来一行有n个数表示前序序列最后一行是中序序列对于30%的数据,n原创 2022-11-03 13:58:36 · 248 阅读 · 0 评论 -
算法导论OJ习题— 数据库查询(红黑树实现AVL树实现)
勤奋的小明为了预习下学期的数据库课程,决定亲自实现一个简单的数据库系统。该数据库系统需要处理用户的数据库插入和查询语句,并输出相应的输出。具体来说,用户的输入共包含若干条插入语句和查询语句。其中每条插入语句包含一个主键(唯一标识)idid和一个字符串sid表示在数据库中插入一个主键为id,属性值为sid的条目。每条查询语句包含一个字符串k,表示在数据库总查询是否有条目属性值为k,若存在属性值为k的条目,则输出该条目对应的主键(输入保证至多有一个条目满足要求),否则输出一个-1表示不存在这样的条目。原创 2022-11-03 13:31:25 · 394 阅读 · 0 评论 -
算法导论习题—主方法求渐进紧确界、递归树方法
对上述问题,《算法导论》中给出的主定理无法求解,但如下形式的主定理可以求解,其符合下述主定理的的第二种情况。树的最底层深度为$ \log_2n$,有。《算法导论》中给出如下形式的主定理。,但它不是多项式意义上的大于。因此主方法不能应用于此递归式。创建上述递归式的对应递归树如下。 每层的结点数都是上一层的。的情况,可知存在一个正常数。个结点,每个结点的代价为。符合主定理情况1,所以。符合主定理情况2,所以。符合主定理情况3,所以。符合主定理情况3,所以。 在递归树中,深度为。因此递归式的一个上界为。原创 2022-10-26 21:32:25 · 2959 阅读 · 1 评论 -
算法导论—最长公共子序列(动态规划)
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。原创 2022-10-26 19:55:43 · 686 阅读 · 0 评论 -
算法导论—矩阵链乘法(动态规划)
进行独立求解,并且要满足最优括号化方案,最后将子问题的最优解合并就可以得到问题的最优解。.由于最优分割点必其中,我们只需要检查所有可能的情况,推到最优者即可。设矩阵Ai···j 的大小为pi-1×pi ,那么。数乘次数的最小值,那么原问题的最优解——计算。最小代价括号化方案的递归求解公式变为。之间的整数),也就是说我们首先计算矩阵。是已知的,但实际上我们并不知道。乘积的结果矩阵,如果问题是非凡的,即。,然后再计算他们的乘积得到最终结果。进行括号化,我们就必须在某个。中得到的最优子结构来计算。原创 2022-10-26 18:58:46 · 978 阅读 · 0 评论 -
算法导论习题—堆排序、快速排序
证:对于递归树中的叶结点深度,最小的深度由划分比例中较小的分支决定,对于。,在构造大顶堆时的速度更快,但仍然是线性时间内,即时间复杂度。比例的数会产生比$ 1 - \alpha: \alpha。P\small{ARTITION}$产生比。的时间复杂度与升序排列时相同,所以。 证:要产生比。为降序时的时间复杂度也为。,则当到达叶结点时,深度。 对一个按升序排列的。,则对应最大深度就是取。时,同理可此时深度满足。更平衡的划分的概率为。原创 2022-10-24 20:14:40 · 585 阅读 · 0 评论 -
算法导论习题—排序、最坏情况线性时间选择算法、小顺序统计量
按照这个规则进行排序可以保证任意的排序算法均是稳定的,需要的空间是原来的两倍,额外时间在于。个元素,然后令每组的较小元素构成一个集合,并对该集合递归执行划分操作,当要找的第。次,得到两部分,其中一部分由各数对中较大数组成,另一部分由较小数组成。个数,对应的较大元素的分组的元素依次大于该分组,取两个分组中前。进行比较的时间,但在线性时间内,不影响总体时间复杂度。个数字,若初始存在只有一个元素的分组,则将该元素加入这。个数,若初始存在只有一个元素的分组,则将该元素加入这。位的整数,确定它的位数需要的时间为。原创 2022-10-24 20:04:09 · 840 阅读 · 0 评论 -
高级数据结构—斐波那契堆与二项堆详细介绍
斐波那契堆历史:Fredman和Tarjan(1986)巧妙的数据结构和分析O(m+nlogn)O(m+nlogn)最短路径算法,也导致了更快的MST算法,加权二分匹配仍然领先于它的时代斐波那契堆直觉:类似于二项式堆,但结构不太复杂减少键和联合运行时间O(1)O(1)O(1)(均摊时间复杂度)“懒惰”联合斐波那契堆是以斐波那契堆数命名的,用于运行时间分析。原创 2022-10-24 19:40:41 · 2336 阅读 · 0 评论 -
高级数据结构—二项堆与斐波那契堆详细介绍(算法导论中科大USTC)
二项树是一种递归定义的有序树。二项树B0B_0B0只有一个结点二项树BkB_kBk由两棵二项树B(k−1)B_{(k-1)}B(k−1)组成的,其中一棵树是另一棵树根的最左孩子每棵二项树都满足最小堆性质。即,父节点的关键字原创 2022-10-24 19:15:19 · 855 阅读 · 0 评论 -
算法导论习题—二叉搜索树、红黑树、区间树
假设取得一个不在区间端点上的最大重叠点,对于这个点,其所在的区间的左端点或右端点中,必定存在一个端点与这个最大重叠点有着相同的区间数,所以,在最大重叠点中,一定存在一个点是其中一个区间的端点。之前出现的区间,只出现了左端点,还没有出现右端点,那么说明该区间与。使用红黑树存储各个区间的端点值,对于每个结点。值,其余操作与红黑树的插入操作相同。值,其余操作与红黑树的删除操作相同。为根节点的树中最大重叠点的重叠数。为根结点的子树中的最小端点值为。的右孩子结点,则此时结点。,若结点为一个左端点,则。原创 2022-10-20 20:04:12 · 642 阅读 · 0 评论 -
matlab解决TSP问题(货郎担问题,旅行商问题)的模拟退火算法
【代码】matlab解决TSP问题(货郎担问题,旅行商问题)的模拟退火算法。原创 2022-08-22 16:56:05 · 673 阅读 · 0 评论 -
matlab最短路径问题(旅行商模型)—模拟退火算法、禁忌搜索算法解决中国省会间最短路径问题
模拟退火算法、禁忌搜索算法。禁忌搜索是对局部领域搜索的一种扩展,是一种全局逐步寻优算法,搜索过程可以接受劣解,有较强的爬山能力.领域结构对收敛性有很大影响。原创 2022-08-22 16:53:19 · 1410 阅读 · 0 评论 -
一篇弄懂层次分析法及其matlab实现
层次分析法的基本步骤1)建立层次分析结构模型深入分析实际问题,将有关因素自.上而下分层(目标一准则或指标一方案或对象) ,上层受下层影响,而层内各因素基本上相对独立。2)构造成对比较阵用成对比较法和1~9尺度,构造各层对.上一层每一因素的成对比较阵。3) 计算权向量并作一 致性检验对每一成对比较阵计算最大特征根和特征向量,作-致性检验,若通过,则特征向量为权向量。4)计算组合权向量(作组合-致性检验)组合权向量可作为决策的定量依据。原创 2022-08-22 16:45:59 · 857 阅读 · 0 评论 -
一篇弄懂主成分分析及matlab实现
在实际问题研究中,多变量问题是经常会遇到的。变量太多,无疑会增加分析问题的难度与复杂性,而且在许多实际问题中,多个变量之间是具有一定的相关关系的。因此,人们会很自然地想到,能否在相关分析的基础上,用较少的新变量代替原来较多的旧变量,而且使这些较少的新变量尽可能多地保留原来变量所反映的信息?> 事实上,这种想法是可以实现的,主成分分析方法就是综合处理这种问题的一种强有力的工具。主成分分析是把原来多个变量划为少数几个综合指标的一种统计分析方法。从数学角度来看,这是一种降维处理技术。**原创 2022-08-22 16:26:24 · 1889 阅读 · 0 评论 -
非线性整数规划的遗传算法Matlab程序
通常,非线性整数规划是一个具有指数复杂度的NP问题,如果约束较为复杂,Matlab优化工具箱和一些优化软件比如lingo等,常常无法应用,即使能应用也不能给出一个较为令人满意的解。这时就需要针对问题设计专门的优化算法。下面举一个遗传算法应用于非线性整数规划的编程实例,供大家参考!原创 2022-08-22 15:53:58 · 2006 阅读 · 0 评论