随笔分类 - 算法
摘要:蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,它是一种思想或者方法的统称,而不是严格意义上的算法。 蒙特卡洛方法的起源是1777年由法国数学家布丰(Comte de Buffon)提出的用投针实验方法求圆周率(具体算法见文末的好文推荐),在20世纪40年代中期,由于计算机的
阅读全文
摘要:基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点
阅读全文
摘要:回溯法(探索与回溯法,Backtracking Method)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。基本做法就是搜索,或是
阅读全文
摘要:定义 无回路的无向图称为树图。 最小生成树(Minimum Spanning Tree,MST),一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。 最小生成树可以用Kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出。 思路 Pri
阅读全文
摘要:定义 无回路的无向图称为树图。 最小生成树(Minimum Spanning Tree,MST),一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。 最小生成树可以用Kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出。 思路 Kru
阅读全文
摘要:问题 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 例如,Patrick教授希望找到一条从菲尼克斯(Phoenix)到印第安纳波利斯(Ind
阅读全文
摘要:问题 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 例如,Patrick教授希望找到一条从菲尼克斯(Phoenix)到印第安纳波利斯(Ind
阅读全文
摘要:哈夫曼编码(Huffman Coding)是一种可变长的前缀码,可以有效地压缩数据:通常可以节省20%~90%的空间。哈夫曼设计了一个贪心算法来构造最优前缀码,被称为哈夫曼编码。 前缀码,没有任何码字是其他码字的前缀。 思路 首先,获取字符与频率的关系。 其次,构建哈夫曼树。 最后,根据0=转向左孩
阅读全文
摘要:问题 活动选择问题是一个调度竞争共享资源的多个活动的问题。 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源(如,演讲会场),而在同一时间内只有一个活动能使用这一资源。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。 每个活动i都有一个要求使用该资源的开始时间s
阅读全文
摘要:贪心算法总是作出在当前看来最好的选择 —— 也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。贪心算法得到的最终结果也可能是整体最优的,例如,单源最短路经问题(Dijskstra算法),最小生成树问题等。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生
阅读全文
摘要:问题 最优二叉搜索树(Optimal Binary Search Tree,Optimal BST)问题,形式化定义:给定一个n个不同关键字的已排序的序列K=<k1, k2, ..., kn>(k1<k2<...<kn),用这些关键字构造一棵二叉搜索树 —— 对每个关键字ki,都有一个概率pi表示其
阅读全文
摘要:问题 最长公共子序列问题(longest-common-subsequnence problem, LCS),给定两个序列X=<x1, x2, ..., xm>, Y=<y1, y2, ..., yn>,求X和Y长度最长的公共子序列。 例如,<B, C, B, A>就是X=<A, B, C, B,
阅读全文
摘要:问题 矩阵链乘法问题(matrix-chain multiplication problem)可描述如下:给定n个矩阵的链<A1, A2, ..., An>,矩阵Ai的规模为pi-1×pi (1<=i<=n),求完全括号化方案,使得计算乘积 A1A2...An所需标量乘法次数最少 —— 完全括号化(
阅读全文
摘要:问题 Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。图15-1给出了一个价格表的样例。 钢条切割问题是这样的:给定
阅读全文
摘要:动态规划与分治法相似,都是通过组合子问题的解来求解原问题(Programming在这里指的是一种表格法,并非是编写计算机程序),但是又有所不同: 分治法将问题分解为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解。 动态规划适合求解最优化问题(optimization prob
阅读全文
摘要:问题 逆序:在序列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。 逆序数:序列中逆序的总数量。 例如,在数列{3,6,7,8,2}中,{3,2},{6,2},{7,2},{8,2}都是逆序。 思路 暴力法 暴力求解就是一个个地去遍历,时间复杂度O(N^2)。
阅读全文
摘要:一般来说,最好情况和最坏情况的时间复杂性是很难计量的 —— 原因是对于问题的任意确定的规模N达到了Tmax(N)的合法输入难以确定,而规模N的每一个输入的概率也难以预测或确定。我们有时也按平均情况计量时间复杂性,但那是在对P(I)做了一些人为的假设(比如等概率)之后才进行的。所做的假设是否符合实际总
阅读全文
摘要:分治就是分而治之,就是把一个大问题分成多个相同或相似的子问题,再把子问题分成更小的子问题……直到最后的子问题可以直接求解出来,然后将所有子问题的解的合并,就得到了大问题的解。在分治策略中,我们递归地求解一个问题,在每层递归中应用如下三个步骤: 分解(Divide),将问题划分为一些子问题,子问题的形
阅读全文
摘要:问题 汉诺塔问题是算法经典问题,一般使用分治的思想来求解这个问题。 汉诺塔问题由三根柱子(起始柱、目标柱、辅助柱)和n个圆盘组成。开始时,在起始柱上有n个圆盘,这些圆盘自下而上,由大到小地放置在一起。各圆盘从小到大编号为1,2,…,n。要求将起始柱上的这些圆盘移动到目标柱上,并仍然按照同样的顺序放置
阅读全文
摘要:问题 整数划分问题,是将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。 例如,正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+
阅读全文