算法导论
算法导论
AI_Younger_Man
这个作者很懒,什么都没留下…
展开
-
动态规划:投资问题
一、投资问题max里面是要遍历一下所有的项目,找最大的。Fk-1是已知的k等于1的时候,便利所有,找投资1能获得最大的。备忘录,标记函数表格:1,2,3,4,5不是投资的钱,看行F定义是下标1是投资1W,最大的收益最后一个:最大收益是61,投资给第四个项目是1W1 0 3 1是每个项目的钱数时间复杂度分析...原创 2020-07-16 21:19:36 · 373 阅读 · 0 评论 -
动态规划:每对结点之间最短路径问题
一、每队结点之间最短路径floed算法证明:有k和没有k的情况:k应该是>=0的。代码:时间复杂度分析:d3就是结果,p3可以看到路径是哪几条,反向追溯原创 2020-07-08 18:25:40 · 1930 阅读 · 0 评论 -
动态规划:LCS最长公共子序列
一、最长公共子序列不要求连续,可以跳着挑子序列:暴力算法是指数时间然后分成三种情况:分别判断最后一个元素:不相等的时候,就不用考虑最后一个元素了表示成数学:2 , 3情况取值最大的。这就是备忘录表。这里面的zk是当前情况下的最后一个二:递归算法实现使用备忘录:就是找一个数组存住重复子问题的解算法描述:寻找最优的解:从表格的最后一个元素开始向上寻找:这张表格式算法生成的,现在是寻找子序列...原创 2020-07-07 22:17:02 · 96 阅读 · 0 评论 -
动态规划:矩阵连乘问题
一、矩阵连乘问题动态规划求解其中k是要遍历的,第三项是当前矩阵相乘需要的计算量。S矩阵记录的就是括号的切分的位置。把公式用代码写出来:都是指数时间:但是比暴力的4的指数强二、用迭代的方法:使用备忘录,那就是从下到上动态规划算法:用到辅助空间,空间换时间在标记函数当中可以找到切割的位置,在上面那张表格里面可以找到切割需要计算的次数。下表记录的是切割的位置信息·,把【1,5】且分成【1,3】【3,5】然后再去查表...原创 2020-07-03 21:06:50 · 312 阅读 · 0 评论 -
动态规划:资源分配问题、关键路径问题
一、资源分配问题二、关键路径问题求得是两点之间最长的路径,不是最短的路径,因为要知道工程多少天边就是项目,结点就是开始或者结束关键活动就是边算法定义:需要遍历两次:从前向后和从后向前从前向后算earlist从后向前算latsest:最晚发生时间从左往右 和 从右往左先从前向后算第一个,再从后向前算第二个选出来上下相等的,就是关键路径其实这就是动态规划算法...原创 2020-07-02 20:34:05 · 1754 阅读 · 0 评论 -
动态规划:多段图问题
一、动态规划存在大量的子问题、最优子结构最有子结构、重叠子问题:递归的解法有重复子问题,但是迭代的揭发,使用备忘录(空间换时间)二、多段图问题下面是一个分成5段的图,V1到V5证明你是不会的,都是假设解决思路:从下一个段Vi+1选一个节点p 迭代实现把重叠子问题保存下来,就是备忘录的问题也可以从左向右递推:...原创 2020-07-02 10:29:12 · 872 阅读 · 0 评论 -
贪心算法:图的m着色问题
一、图的着色2种颜色先选定一种颜色,然后给途中所有节点遍历着色:是不是跟顶点顺序遍历有关呢?计算机证明用4种颜色可以对图着色,但是数学证明不了算法:方法:原创 2020-07-01 21:02:12 · 1121 阅读 · 0 评论 -
贪心算法:TSP类问题
一、TSP问题用贪心策略也有好多方法:这两个算法有点像最小生成树算法图示算法:贪心算法:每一个点都要检查一次而且得到的解并不是最优解,所以贪心要证明,一般证明有点困难二、第二个策略从全局边集当中选择,并且不能构成回路堆排序:...原创 2020-07-01 08:50:26 · 676 阅读 · 0 评论 -
贪心算法:磁带最优存储问题
一:单带最有存储有点像机器流水线问题:二、多带多条磁带三条流水线,多个产品,先把产品按照时间排序过,然后把0-15的16个产品一次放到3条流水线上原创 2020-06-29 21:56:09 · 1761 阅读 · 0 评论 -
贪心算法:一般背包问题
一、一般的背包问题第一种:01背包问题(动态规划)第二种:可以且分的物品,物品只有1件(贪心算法)第三种:物品个数有N种多件因为可以切分,最后背包会装满一般大家都能想到的贪心策略:选择单位价值最优的,所以首先要求解单位价值,然后按照单位价值排序举反例证明不行:算法描述:...原创 2020-06-29 21:43:15 · 997 阅读 · 0 评论 -
贪心算法:哈夫曼编码、二路最佳合并、最小代价生成树、单源点最短路径
一、哈夫曼编码构造哈夫曼树:按照频率来分配的(频率递增是因为出现次数多,那么就越深权重越大),就是生成哈夫曼树,基于树形结构,然后再次插进队列里面。频率低的,就断。频率高的就长二、二路最佳合并三、最小代价声称是prim,klusikaer所有的定点都要包涵,而且保证选择的边权值之和最小记得有一个是加边,有一个是加点加边的时候不能构成环克鲁斯卡尔是变得全集当中选择当前最优的边普利姆是在当前点中连接的边中选择当前最优的边和点普利姆算法:查找当前已经加进来的点集当中的边,选择最原创 2020-06-29 21:27:39 · 614 阅读 · 0 评论 -
贪心算法:活动选择问题
算法设计的五大主要方法:分治、贪心、DP、分支限界、回法。。。在网上就是解决NP的近似算法贪心算法和动态规划算法一般都用于求解最优化问题在约束条件之下求解最优化问题原创 2020-06-29 20:43:05 · 2243 阅读 · 0 评论 -
贪心算法(一):活动安排问题、背包问题、最优装载问题
贪心算法:贪心算法都可以改写成为动态规划算法一、活动安排问题先看看找零钱的问题:比如说进程使用单核cpu,求一个最优安排问题:贪心算法的策略选择:结束时间早的优先选择,结束时间早,给后面任务留出来的时间更多啊。活动安排问题的选择:每次选择最早结束的活动第一个活动必须选择,因为数组是按照结束时间的递增排序的:贪心算法必须进行证明:数学归纳法证明:举例说明:但是不可以求01背包问题但是可以求解背包问题:求单位下的价值二、最优装载问题最优装原创 2020-06-28 21:32:23 · 1507 阅读 · 0 评论 -
动态规划(四):投资问题、背包问题、最右二叉搜索树问题
一、投资问题收益矩阵重新思考问题:设置递推方程:和的最大值也就是对于分配的每一种情况求一下最大分配的值到第三个项目的时候,把前两个项目当成第一部分,第三个项目当成第二个可分配的部分第三个的时候,2,0;1,1;0,2 只是分配到了两个部分,第一个给第一部分,第二个给第二部分。现在就变成,前一部分份2W最优,个当前3分0W;前一部分最优分1W,3份1W;前一部分最优分0W,和当前部分份2W。备忘录:记录当前收益和当前项目投资的钱数所以最终最优的收益是:1,0,3,1二、原创 2020-06-27 17:28:07 · 328 阅读 · 0 评论 -
动态规划(三):凸多边形
一、凸多边形最有三角切分但是两点之间切分的权重是不一样的。且分的弦是有代价的,也叫做权重,把权重矩阵也给你了。分析动态规划:设置数据结构:另一个应用:图像压缩的问题电路布线问题:这个需要掌握的相交的意思:就是连线交叉了,现在就是为了避免交叉,可以有层次感,每层都有连线,要求尽可能连线而且层次用的越少越好首先:连线的方式π给我们了,N(i,j)代表的意思是,i是上面的接线柱的个数,j是下面接线柱的个数,MNS是N中最大不相交的子集,SIZE是MNS中的线的条数。比如上图SIZE(4原创 2020-06-27 16:02:51 · 726 阅读 · 0 评论 -
动态规划(三):最大子段和
最大子段和连续的,不能跳跃,求连续的子段和最大的情况。解法一:首先是穷举法,穷举所有的连续子段并求和,找最大,时间复杂度N3# 穷举法def max_sub_arr_sum(arr): max = 0 for i in range(len(arr)): for j in range(len(arr)): sum = 0 for k in range(i, j+1): sum += ar原创 2020-06-24 11:00:46 · 620 阅读 · 0 评论 -
动态规划(二)
最长公共子序列给定两个序列,找其公共的子序列,可以不间隔,但是顺序需要递增如果最后一个元素是相同的,那么最长的公共子序列一定包含最后一个元素。在这个结论之上。考虑2、3把上面的用公式写出来:采用动态规划,从下到上:求解和构造函数输出的 x[i],是公共子序列这个矩阵从上到下构造,最长公共子序列长度是3。下面这个矩阵应该是 c 矩阵,里面是长度def LCSLength(ch1, ch2): length = [] stand = [] for i in原创 2020-06-23 20:44:40 · 116 阅读 · 0 评论 -
动态规划(1)
动态规划例题52张牌有20个向上,剩下的向下。把20个向上的平均分成两堆思路:把52张牌分成20和32,然后把20的牌上下颠倒就好。通常DP求解的是最优解,不会求解累乘,累加等等。最优子结构。分治:分解成若干个子问题,若干个子问题,一层一层下去DP:把一个问题分解成前问题,然后向后求解矩阵连乘的算法:k的位置需要枚举所有的对于矩阵连乘的问题,需要计算两个矩阵的计算次数,计算N-1个倒推的方法:先计算最下面的一个一个的情况,再计算两个两个的情况,再计算三个三个的情况下原创 2020-06-21 18:25:08 · 152 阅读 · 0 评论 -
分治法:求数组中最值问题
给定一个数组返回最大值。可以遍历数组,但是时间复杂度是On现在用分治法:时间复杂度是Ologn或者使用Arrays先对数组进行升序排序,输出最后一个元素也行。import java.util.Arrays;public class maxSubstring { public static int getArrMaxDivide(Integer arr[], int strat, ...原创 2020-02-25 14:09:51 · 635 阅读 · 0 评论 -
动态规划:返回数组最大子序和(java)
给定一个整数数组,返回数组中连续的最大子序和。声明一个同样大小的辅助数组temp,保存当前位置最大的子序和。然后对这个temp数组求最大值。求数组的最大值可以用 分治法 或者 调用Arrays的APIimport java.util.Arrays;public class maxSubstring { public static int getArrMaxDivide(Inte...原创 2020-02-25 14:03:26 · 418 阅读 · 0 评论 -
分治法-归并排序的设计与分析(c++)
一、分治算法分解:将原问题分解成为性质一样的若干子问题。解决:解决子问题,并递归求解子问题的问题。问题足够小的时候可以直接求解。合并:合并子问题的解。归并排序思路:1、merge-sort函数负责分解原数组2、merge函数被调用合并子数组,同时进行排序。二、算法分析调用主定理:原问题被分解为2个n/2的子问题。三、代码实现c++#include <s...原创 2020-02-19 18:39:30 · 861 阅读 · 0 评论