
算法
文章平均质量分 87
风仲达
生命不息奋斗不止既然选择了编程就不应该只是入门
展开
-
0010算法笔记——【动态规划】矩阵连乘问题
问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。 问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一原创 2013-01-13 20:09:17 · 104868 阅读 · 25 评论 -
0042算法笔记——【随机化算法】计算π值和计算定积分
1、计算π值 问题描述 设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为 。所以当n足够大时,k与n之比就逼近这一概率。从而。 程序具体代码如下://随机化算法 用随机投点法计算π值#include "stdafx.h"#incl原创 2013-06-01 15:32:50 · 15271 阅读 · 6 评论 -
0041算法笔记——【随机化算法】随机化算法与随机数问题
1、随机化算法 (1)描述:随机化算法是这样一种算法,在算法中使用了随机函数,且随机函数的返回值直接或者间接的影响了算法的执行流程或执行结果。随机化算法基于随机方法,依赖于概率大小。 (2)分类:一般情况下,可将概率(随机化)算法大致分为四类:数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。原创 2013-05-27 11:03:49 · 8829 阅读 · 1 评论 -
0035算法笔记——【分支限界法】布线问题
问题描述 印刷电路板将布线区域划分成n×m个方格如图a所示。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图b所示。为了避免线路相交,已布了线的方格做了封锁标记,其它线路不允穿过被封锁的方格。 一个布线的例子:图中包含障碍。起始点为a,目标点为b。 算法思想 解此问题的队原创 2013-05-10 17:31:16 · 18761 阅读 · 6 评论 -
0034算法笔记——【分支限界法】最优装载问题
问题描述 有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。原创 2013-05-10 15:45:08 · 20521 阅读 · 4 评论 -
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题
1、分支限界法 (1)描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。 所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。 所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。 (2)原理:按照广度优先的原则,一个活结点一旦成为扩展结点(E-结点原创 2013-05-08 17:39:07 · 56796 阅读 · 9 评论 -
0031算法笔记——【回溯法】旅行员售货问题和圆排列问题
1、旅行员售货问题 问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。 问题分析 旅行售货员问题的解空间是一棵排列树。对于排列树的回溯法与生成1,2,……n的所有排列的递归算法Perm类似。开始时x=[1,2,……n],则相应的排原创 2013-05-06 15:47:45 · 22724 阅读 · 2 评论 -
0030算法笔记——【回溯法】最大团问题和图的m着色问题
1、最大团问题 问题描述 给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中原创 2013-04-10 11:13:58 · 39561 阅读 · 6 评论 -
0028算法笔记——【回溯法】批作业调度问题和符号三角形问题
1、批作业调度问题 (1)问题描述 给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。 批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完原创 2013-04-06 16:55:37 · 9501 阅读 · 4 评论 -
0027算法笔记——【回溯法】回溯法与装载问题
1、回溯法 (1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。 (2)原理: 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的原创 2013-04-05 21:10:57 · 47322 阅读 · 8 评论 -
0026算法笔记——【贪心算法】多机调度问题
1、问题描述 设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。 多机调度问题是一个NP完全问题,到目前为止还没有完全有效的解法。原创 2013-03-30 17:51:10 · 32998 阅读 · 3 评论 -
0043算法笔记——【随机化算法】解非线性方程组
问题描述 求解下面的非线性方程组 其中,x1,x2,…,xn是实变量,fi是未知量x1,x2,…,xn的非线性实函数。要求确定上述方程组在指定求根范围内的一组解。 问题分析 解决这类问题有多种数值方法,如:牛顿法、拟牛顿法、粒子群算法等。最常用的有线性化方法和求函数极小值方法。为了求解所给的非线性方程组,构造一目标函数 式中,原创 2013-06-05 11:54:46 · 9102 阅读 · 3 评论 -
0045算法笔记——【随机化算法】舍伍德随机化思想搜索有序表
问题描述 用两个数组来表示所给的含有n个元素的有序集S。用value[0:n]存储有序集中的元素,link[0:n]存储有序集中元素在数组value中位置的指针(实际上使用数组模拟链表)。link[0]指向有序集中的第一个元素,集value[link[0]]是集合中的最小元素。一般地,如果value[i]是所给有序集S中的第k个元素,则value[link[i]]是S中第k+1个元素。原创 2013-06-17 15:21:35 · 6268 阅读 · 1 评论 -
0050算法笔记——【线性规划】单纯形算法(未完全实现)
题外话:王晓东的《算法设计与分析》看到现在,终于遇到自己琢磨不透的代码了。这里粘出来,求大神指点迷津~ 1、线性规划问题及其表示 线性规划问题可表示为如下形式: 变量满足约束条件(8.2)-(8.5)式的一组值称为线性规划问题的一个可行解。 所有可行解构成的集合称为线性规划问题的可行区域。 使目标函数取得极值的可行解称为最优解。原创 2013-07-08 08:05:41 · 14119 阅读 · 3 评论 -
0020算法笔记——【动态规划】最优二叉搜索树问题
1、问题描速: 设 S={x1, x2, ···, xn} 是一个有序集合,且x1, x2, ···, xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:存储于每个顶点中的元素x 大于其左子树中任一个顶点中存储的元素,小于其右子树中任意顶点中存储的元素。二叉树中的叶顶点是形如(xi, xi+1) 的开区间。在表示S的二叉搜索树中搜索一个元素x,返原创 2013-03-20 10:37:30 · 27657 阅读 · 5 评论 -
0018算法笔记——【动态规划】流水作业调度问题与Johnson法则
1、问题描述: n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 2、问题分析 直观上,原创 2013-03-15 16:42:36 · 62258 阅读 · 14 评论 -
0006算法笔记——【分治法】线性时间选择
线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。 1、随机划分线性选择 线性时间选择随机划分法可以模仿随机化快速排序算法设计。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。 程序清单如下://2d9-1 随机划分线性原创 2013-01-08 17:43:20 · 40059 阅读 · 15 评论 -
0036算法笔记——【分支限界法】0-1背包问题
问题描述 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 算法设原创 2013-05-11 20:24:25 · 32834 阅读 · 10 评论 -
0029算法笔记——【回溯法】n后问题和0-1背包问题
1、n后问题 问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 问题解析:用n元数组x[1:n]表示n后问题的解。其中,x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇后放在同原创 2013-04-08 21:07:34 · 15733 阅读 · 6 评论 -
0044算法笔记——【随机化算法】舍伍德(Sherwood)算法和线性时间选择问题
1、舍伍德(Sherwood)算法 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为。这显然不能排除存在x∈Xn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有。这就是舍伍德算法设计的基本思想。当s(n)与tA(n)相比可忽略时,舍伍德算法可原创 2013-06-06 14:51:19 · 15495 阅读 · 2 评论 -
0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题
1、拉斯维加斯(Las Vegas)算法 拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法找不到解。与蒙特卡罗算法类似,拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失败的概率任意小。拉斯维加斯算法的一个显著特征是它所作的随机性原创 2013-07-04 18:15:01 · 15758 阅读 · 1 评论 -
0048算法笔记——【随机化算法】拉斯维加斯随机化算法求解整数因子分解中的因子分割问题
问题描述 设n>1是一个整数。关于整数n的因子分解问题是找出n的如下形式的唯一分解式:。其中,p1如果n是一个合数,则n必有一个非平凡因子x,1给定一个合数n,求n的一个非平凡因子的问题称为整数n的因子分割问题。 求解思路 整数因子分解最直观的方法当数“试除法”,数论中的Mertens定理告诉我们76%的奇数都有小于100的素因子,因此对于大多数整数,“试除法”已原创 2013-07-04 21:51:39 · 6120 阅读 · 0 评论 -
0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题
1、蒙特卡罗算法 基本概述 蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。 在实际应用中常会遇到一些问题,不论采用确定性算法或随机化算法都无法保证每次都能得到正确的解答。蒙特卡罗原创 2013-07-05 13:59:36 · 15887 阅读 · 3 评论 -
0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题
问题描述 如果用有序链表来表示一个含有n个元素的有序集S,则在最坏情况下,搜索S中一个元素需要O(n)计算时间。提高有序链表效率的一个技巧是在有序链表的部分结点处增设附加指针以提高其搜索性能。在增设附加指针的有序链表中搜索一个元素时,可借助于附加指针跳过链表中若干结点,加快搜索速度。这种增加了向前附加指针的有序链表称为跳跃表。 应在跳跃表的哪些结点增加附加指针以及在该结点处原创 2013-06-24 15:36:51 · 4770 阅读 · 0 评论 -
0025算法笔记——【贪心算法】最小生成树问题
1、问题描述 设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。 网络的最小生成树在实际中有广泛应用。例如,在设计通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][原创 2013-03-29 21:02:23 · 16623 阅读 · 5 评论 -
0024算法笔记——【贪心算法】单源最短路径问题
1、问题描述 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 2、Dijkstra算法 Dijkstra算法是解单源最短路径问题的贪心算法。 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个原创 2013-03-27 18:19:55 · 34590 阅读 · 3 评论 -
0007算法笔记——【分治法】最接近点对问题
问题场景:在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。 问题描述:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的原创 2013-01-09 22:09:13 · 79794 阅读 · 26 评论 -
0005算法笔记——【分治法】快速排序
1、未优化的快速排序 快速排序的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 程序清单如下://2d8-1 未优化的快速排序#include "stdafx.h"#include usi原创 2013-01-07 21:37:10 · 7288 阅读 · 2 评论 -
0004算法笔记——【分治法】合并排序
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,合并排序也叫归并排序。原创 2013-01-07 20:16:51 · 9950 阅读 · 1 评论 -
0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
1、分治法分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出原创 2013-01-07 19:51:13 · 18502 阅读 · 1 评论 -
0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
递归的概念想必大家都清楚,概念神马的直接略过。这里介绍递归相关的几个问题。 1、排列问题 设R={r1,r2,...,rn}是要进行排列的n个元素,Ri=R-{ri}。集合x中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳如下: 当n=1时,Perm(R)=(r),其中r是集合中唯原创 2013-01-07 15:00:19 · 9807 阅读 · 3 评论 -
0040算法笔记——【分支限界法】批处理作业调度问题
问题描述 给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。 批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。 例:原创 2013-05-20 21:24:54 · 34250 阅读 · 12 评论 -
0039算法笔记——【分支限界法】电路板排列问题
问题描述 将n块电路板以最佳排列方式插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。设B={1, 2, …, n}是n块电路板的集合,L={N1, N2, …, Nm}是连接这n块电路板中若干电路板的m个连接块。Ni是B的一个子集,且Ni中的电路板用同一条导线连接在一起。设x表示n块电路板的一个排列,即在机箱的第i个插槽中插入的电路板编号是x[i]。x所确原创 2013-05-20 20:10:57 · 22387 阅读 · 5 评论 -
0037算法笔记——【分支限界法】最大团问题
问题描述 给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点原创 2013-05-20 19:39:04 · 16512 阅读 · 3 评论 -
0038算法笔记——【分支限界法】旅行员售货问题
问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。 算法思路 旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在图G中找出费用最小的周游路线。路线是一个带权图。图中各边的费用(权)为原创 2013-05-20 19:53:21 · 28901 阅读 · 5 评论 -
0032算法笔记——【回溯法】电路板排列问题和连续邮资问题
1、电路板排列问题 问题描述 将n块电路板以最佳排列方式插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。设B={1, 2, …, n}是n块电路板的集合,L={N1, N2, …, Nm}是连接这n块电路板中若干电路板的m个连接块。Ni是B的一个子集,且Ni中的电路板用同一条导线连接在一起。设x表示n块电路板的一个排列,即在机箱的第i个插槽中插入原创 2013-05-08 10:10:49 · 22156 阅读 · 7 评论 -
0008算法笔记——【分治法】循环赛事日程表
问题描述: 设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i原创 2013-01-10 11:58:08 · 46360 阅读 · 13 评论 -
0009算法笔记——【动态规划】动态规划与斐波那契数列问题,最短路径问题
1、动态规划算法: 动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的原创 2013-01-12 15:20:30 · 19412 阅读 · 3 评论 -
0011算法笔记——【动态规划】最长公共子序列问题(LCS)
问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X= { x1, x2,…, xm},则另一序列Z= {z1, z2,…, zk}是X的子序列是指存在一个严格递增的下标序列 {i1, i2,…, ik},使得对于所有j=1,2,…,k有 Xij=Zj。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标原创 2013-01-14 18:56:37 · 16171 阅读 · 2 评论 -
0023算法笔记——【贪心算法】哈夫曼编码问题
1、问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。一个包含100,000个字符的文件,各字符出现频率不同,如下表所示。 有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示。若采用定长编码表原创 2013-03-26 19:22:21 · 114850 阅读 · 18 评论