![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法基础
文章平均质量分 79
薛猫颚的腚
这个作者很懒,什么都没留下…
展开
-
回溯法之n后问题以及图的m着色问题
n后问题描述输入:n*n的棋盘n个皇后输出:n个皇后的放置方案:任意两个皇后不得在同一行,同一列,同一斜线上n后解空间每行有且仅有一个皇后用x[i]表示第i行皇后位于第几列此皇后的坐标为(i,x[i])问题的解是x[1,…,n],满足任意两个皇后不在同一列上:x[i]!=x[j]任意两个皇后不在同一斜线上: |i – j| != |x[i] – x[j]|x[1, …, n]是{1, …, n}的一个排列图的m着色问题描述给定无向连通图G和m种不同的颜色。用这些颜色原创 2020-11-26 22:23:18 · 362 阅读 · 0 评论 -
回溯法之批处理作业调度思路详解
问题详解输入:n个作业{1,2,3…n}两台机器(M1和M2)作业i在M1和M2上的处理时间分别是a[i]和b[i]每个作业必须先由M1处理,再由M2处理输出:作业调度方案使得完成时间最小举例说明现在给出下列输入:解空间为:{123,132,213,231,312,321}例如132,其调度策略如下图所示:可以看出,总的时间=B【1】+B【3】+B【2】,而B【i】的计算过程如下:首先计算A[i] = A[i-1]+a[i],比较A[i]与B[i-1]的大小,B[i]=较原创 2020-11-26 21:58:18 · 1212 阅读 · 0 评论 -
回溯法之旅行商问题解题思路详解
问题定义输入:完全无向带权图G=(V,E)|V|=n, |E|=m对于E中的某条边e,其长度为c(e)输出:最短哈密顿回路(经过每个节点一次且仅一次的回路)ps.这是一个NP问题,没有有效的算法求出它的最优解,但是利用回溯法我们可以得到近似最优解。举例详解无向带权图如下:构造解空间树:按深度优先遍历这棵树,每遍历到一个叶子,就记录小当前的代价,例如,我们进行1-2-3-4-1的路径,其代价为30+5+20+4=59,再回溯到1,2节点处,进行1-2-3-4-1的路径,其代价30+1原创 2020-11-26 21:25:33 · 3104 阅读 · 0 评论 -
回溯法之0-1背包问题(算法思路解析)
回溯法解0-1背包问题问题描述输入:n件物品的价值和重量{<w1, v1>, <w2, v2>,…, <wn, vn>}和背包容量C输出:(x1, x2, …, xn),xi∈{0, 1}满足放入的物品重量小于背包容量的前提下价值最大优化目标:价值最大化实例讲解假设:物品个数为 n=3背包的容量为 C=30物品的重量分别为 w={16,15,15}物品的价值分别为 v={45,25,25}1.此时的解空间可以为(x1, x2, x3)的所有可能取{(原创 2020-11-26 20:55:32 · 6694 阅读 · 0 评论 -
回溯法概述
回溯法罗密欧与朱丽叶问题迷宫是一些互相连通的交叉路口的集合,给定一个入口、一个出口。当从入口到出口存在通路时,输出选中的一条通路;否则,输出无通路存在。回溯法的基本思想1.针对给出的问题,定义问题的解空间2.确定易于搜索的解空间结构3.以深度优先的方式搜索解空间,并在搜索过程中使用剪枝算法避免无效搜索用约束函数在扩展结点处剪去不满足约束的子树用限界函数剪去得不到的最优解的子树4.回溯法解题的一个显著特征就是在搜索过程中动态产生问题的解空间5.使用与接一些组合数相当大的问题,具有“通原创 2020-11-26 20:27:43 · 385 阅读 · 0 评论 -
贪心算法之多机调度问题(思路概述+复杂度分析)
多机调度问题描述输入:n个独立的作业{1,2,3,4,5,6,…n},作业i所需要的处理时间为tim台机器,任何作业可以在任何机器上完成,但作业的处理不允许中断输出:最优的作业调度方案,使得n个作业在尽可能短的时间内由m台机器完成。问题分析多机调度问题是个NP完全问题,到目前为止没有有效的算法(求得最优解的有效的算法),但是利用贪心算法可以近似求出最优解。采用最长处理时间作业优先的贪心选择策略,可以设计出较好的解。在n<m时,我们大可以为每个作业分配一台机器而在n>m时,我们原创 2020-11-26 19:52:39 · 7132 阅读 · 0 评论 -
贪心算法之哈夫曼编码(思路详解+画图演示算法过程)
哈夫曼编码一些需要了解的基本概念对字符的编码有两种:定长编码和变长编码,两者的编码长度往往差得很大,以下面的编码为例。定长编码:编码长度为:10000*3=30000变长编码:编码长度为:45001+13003+1200-3+16003+9004+500*4=22400定义:前缀码前缀码是对字符的0,1编码,任意字符的编码都不是其它字符编码的前缀。例如:如果我们接收到了:001011101那么我可以将其翻译为:aabe定义:前缀码跟二叉树的转换定义:平均码长(二叉树代价)原创 2020-11-26 19:15:38 · 3978 阅读 · 1 评论 -
贪心算法之活动安排问题(填表详解+思路解析)
贪心算法总是选择当前看起来最优的选择(局部最优解),得到的结果是一个整体最优解。但是总是选择局部最优解并不总是能得到整体最优解,需要在问题具有:贪心选择性和优化子结构时才成立。贪心选择性:第一次做出贪心选择是正确的;优化子结构:第一次做完贪心选择后,得到一个与原问题定义相同(但输入不同)的子问题;贪心算法的基本要素贪心选择性质1.贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。2.贪心原创 2020-11-26 18:33:25 · 15309 阅读 · 3 评论 -
动态规划之最优二叉搜索树
最优二叉搜索树最优二叉搜索树的定义输入:有序数的集合{x1,x2…xn}输出:最优二叉搜索树搜索树的代价:设树中xi节点的深度为ci,叶节点(xi,xi+1)的深度为di,数字落在节点的概率用pi表示,落在叶子节点的间隙的概率用qi表示。上图中椭圆为节点,方框为间隙。代价为优化目标:最小代价函数优化子结构重叠子问题...原创 2020-11-25 20:31:39 · 1119 阅读 · 0 评论 -
动态规划之0-1背包问题(思路详解+表格演示过程+最优解打印方法+详细代码)
问题简介输入:n种物品和一个背包物品i的重量是wi,价值为vi背包的容量是C输出:装入背包的物品优化目标是:装入背包的物品总价值最大优化子结构设(x1,x2,x3…xn)是0-1背包问题的一个最优解。如果x1=1,那么(x2,x3,x4,x5…xn)是以下子问题的最优解:如果x1 =0:则 (x2, …, xn) 是以下子问题的最优解递归关系设m(i, j)为背包问题的最优值,这里背包容量为j,可选物品为i, i+1, …, n,有如下递归关系:如果i<n时i=n时原创 2020-11-25 19:16:59 · 11073 阅读 · 1 评论 -
动态规划之凸多边形最优三角剖分
凸多边形最优三角剖分相关定义凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w,要求确定该凸多边形的三角剖分,使三角剖分中诸三角形上权之和为最小。(摘自:https://blog.csdn.net/pi9nc/article/details/9750091)优化子结构P=(v0,v1,v2,v3…vn)是n+1个顶点的凸多边形Tp是P的优化三角剖分,包含三角形v0vkvn递归关系的确定:原创 2020-11-25 16:56:38 · 562 阅读 · 0 评论 -
动态规划之最长公共子序列问题详解(解题思路+算法思想+表格详解)
最长公共子序列子序列与子串子序列:有序列中若干符号,按原相对次序构成。例如 Tsinghua中sina是它的子序列,computer中omutr是子序列。它不要求所选的字母连续,只要求是按原次序组成就好。子串是字符串中的一部分称为子串。例如Tsinghua中hua是子串,而shua就不是它的子串。公共子序列就是两个序列X和Y共同的子序列。最长公共子序列问题描述输入:X={x1,x2,x3…xm},Y={y1,y2,y3,y4…yn}输出:Z=X和Y最长公共子序列求解思路我们第一印象肯定是暴原创 2020-11-25 15:45:18 · 5203 阅读 · 3 评论 -
动态规划之矩阵连乘问题详细解读(思路解读+填表+代码)
动态规划简介动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填原创 2020-11-25 14:20:21 · 72973 阅读 · 18 评论 -
递归与分治之最接近点对问题
最接近点对问题给定平面上n个点的集合S,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。首先我们考虑一维情况下,此时空间S中的n个点可以看为x轴上的n个实数,最接近点对就变成了n个实数中最接近的2个数。当然我们可以用暴力的方式,求没两个临近的点的距离,记录并比较找到最小值,但是我们现在是在为这两个点在空间中解决方案铺路,空间中的点如果进行暴力求解,其复杂度将大的惊人,因此,我们选择分治法来解决这一问题。我们将x轴用某一个点分为两部分,分别对两部分递归求解最小距离然后比较取最小值是否原创 2020-11-25 13:13:00 · 1022 阅读 · 0 评论 -
递归与分治之线性时间选择思路详解
线性时间选择要求:给定线性序集中n个元素和一个整数k,1<=k<=n,要求找出n个元素中第k小的元素。方法一 随机选择法算法的思路如下:从a[p:r]中随机选择一个元素将其划分为三部分1.a[p:q-1],其中元素都小于等于a[q]2.a[q],我们设定的划分基准3.a[q+1:r],其中的元素都大于等于a[q]a[p:q]的元素个数为m=q-p+1(例如就有两个元素,其下标为p和p+1,元素个数2=(p+1)-p+1)拿我们要找的数字序号k跟m比较:如果k =m,那么我们原创 2020-11-25 12:47:25 · 504 阅读 · 1 评论 -
递归与分治之Srassen矩阵乘法
Srassen矩阵乘法矩阵乘法的传统做法的复杂度:O(n^3)使用分治法的方法跟处理大整数乘法的做法一致,就是拆分矩阵,最后合并。只不过这次我们是将矩阵分割为几个大小相等的子矩阵,具体如下:这里的A,B,C都代指矩阵块,而非矩阵中的元素。显然其复杂度仍然是O(n^3)为了降低复杂度我们仍选择用加法来替代乘法,只不过这次的元素将比大整数乘法中复杂得多。此时的复杂度O(n^(log7))=O(n^(2.81))据研究,目前最好的计算时间上界是O(n^2.376)...原创 2020-11-25 11:52:14 · 310 阅读 · 0 评论 -
递归与分治之大整数乘法
大整数乘法现在我们给出两个数字1234和4321(这两个数字并不大,以此为例而已),按照我们做乘法的习惯,我们写成竖式,用1234分别跟4,3,2,1相乘并对应移位相加得到结果,那么我们在这个过程中用了几次乘法呢?是4次?不,其实1234跟4相乘是1,2,3,4分别乘4,也是4次乘法,因此一共我们使用了4*4次乘法。这仅仅是4位,如果是更多,那么算法的复杂度无疑是O(n^2),为了提高效率,降低这种复杂度,我们可以使用分治法。首先,我们将两个n位大整数X,Y分开,分为四个n/2位的整数,如下:例如原创 2020-11-25 11:44:09 · 567 阅读 · 2 评论 -
递归与分治之合并排序和快速排序
合并排序合并排序的基本思想是:将待排序元素分为大小大致相同的两个子集,分别对两个子集合进行排序,最终将排序好的子集合合并为所要求的排好序的集合。具体步骤可以通过下列的动图查看:(引用自https://blog.csdn.net/li528405176/article/details/86615003)void merge_sort_recursive(int arr[], int reg[], int start, int end)//仅列举函数 { if (start >= end原创 2020-11-25 11:22:14 · 590 阅读 · 0 评论 -
递归与分治思想之二分搜索详解
二分搜索二分搜索是运用分治思想的典型例题。分治法的思想是将一个难以解决的大问题分割成一些规模较小的有相同求解方式的问题,以逐个求解。二分搜索,也叫做二分查找,要求是输入非降序排列的n个元素的数组,以及要找的元素x,输出已找到,或者未找到。二分搜索的做法很简单,就是将要找的元素X跟已有非降序的数组的中位数进行比较,如果X>中位数,则x位于大于中位数的那一半数组中,如果X<中位数,X位于小于中位数的那一半数组里,如果X=中位数,那太好了,这就是我们希望的,直接输出找到了即可。那么这种做法有原创 2020-11-24 21:08:24 · 912 阅读 · 1 评论