
算法导论
蓝翳-裂缝中的阳光
First you do it then something change it.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
动态规划----装配线调度
问题描述A manufacturing problem to find the fastest way through a factory. There are two assembly lines, each withn stations; the jth station on line i is denotedSi,jand the assembly time at that原创 2013-04-02 16:33:40 · 572 阅读 · 0 评论 -
B树----B-TREE的实现
B树又叫平衡多路查找树,是一种组织和维护外存文件系统非常有效的数据结构一棵m阶的B树(m叉树)的特性如下:树中每个结点最多含有m个孩子(m>=2);除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]=(m-1)/2个孩子(其中ceil(x)是一个取上限的函数);若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节原创 2013-04-02 18:32:35 · 793 阅读 · 0 评论 -
最小生成树Prim算法
Prim算法的执行非常类似于寻找图的最短通路的Dijkstra算法。Prim算法的特点是集合A中的边总是只形成单棵树。如图5所示,阴影覆盖的边属于正在生成的树,树中的结点为黑色。在算法的每一步,树中的结点确定了图的一个割,并且通过该割的轻边被加进树中。树从任意根结点r开始形成并逐渐生长直至该树跨越了V中的所有结点。在每一步,连接A中某结点到V-A中某结点的轻边被加入到树中,由推论2,该规则仅加大对原创 2013-04-06 18:18:39 · 864 阅读 · 1 评论 -
快速求幂算法
我们知道在数学表达式中pow(x, n)表示求x^n的幂。一般情况下,如果我们要写一个程序的话,最简单的程序可能是这样的:[cpp] view plaincopyint pow(int x, int n){ int result = 1; while (n != 0){ result = re转载 2013-04-07 23:27:55 · 906 阅读 · 0 评论 -
单源最短路径Bellman-Ford算法
对一个带权有向图G=(V,E),给定一个源顶点S,找出S到图中其他顶点v的最短路径即单源最短路径问题。该问题还有很多变体,像单终点最短路径、单对顶点最短路径、每对顶点间的最短路径等等。最短路径问题是具有最优子结构的:一对顶点间的最短路径包含了该路径上的顶点间的最短路径。直观上理解,如果该路径上的两个顶点间的路径pij不是最短路径,那么用这两个顶点间的最短路径代替pij,那么就会出现一条更短原创 2013-04-08 11:29:33 · 1338 阅读 · 2 评论 -
最小生成树---kruskal算法
克鲁斯卡尔(Kruskal)算法(只与边相关) 算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边有关系,可以证明其时间复杂度为O(eloge)。算法过程:1.将图各边按照权值进行排序2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件原创 2013-04-02 13:39:12 · 636 阅读 · 0 评论 -
Prim算法与Dijkstra算法的区别
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那么二者是否等价呢?也就是说是否Dijkstra也可以计算出最小生成树而Prim也可以计算出从第一个顶点v0到其他点的最短路径呢?答案是否定的,否则就不必有两个算法了。转载 2013-04-09 09:19:11 · 768 阅读 · 0 评论 -
单源最短路径Dijkstra算法
Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定。算法反复选择具有最短路径估计的顶点u∈V - S,并将u加入S中,对u的所有出边进行松弛,在下列算法实现中,用到了顶点的最小优先队列Q,排序关键字为顶点的d值。d为实时权值。代码如下:#include#includeusing namespace std;#defi原创 2013-04-09 10:43:53 · 1497 阅读 · 1 评论 -
图邻接链表基本操作--广度优先、深度优先、拓扑排序
和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。图的遍历顺序有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。对每种搜索顺序,访问各顶点的顺序也不是唯一的。1、邻接表及逆邻接表的存储方法(1)定义邻接表是图的一种链式原创 2013-04-02 18:36:43 · 1520 阅读 · 0 评论 -
斐波纳契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了《斐波纳契数列》季刊,专门刊载这方面的研究成果。拓展:一个台阶总共有n级原创 2013-04-11 18:33:43 · 860 阅读 · 0 评论 -
面试题---求数据之和算法二
上一篇是几乎用的别人的方法,我想了下,那样的排版太难看了,而且他是从n开始往前开始动态规划,所以我就想从前开始往后开始动态规划求出sum的组合元素,这样得出的结果更有层次,思想差不多,废话不多说,直接上代码:#include#includeusing namespace std;list factorlist;void FindFactorDP(int n,int sum,原创 2013-04-06 14:52:31 · 479 阅读 · 0 评论 -
面试题---求数据之和
编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.#include#includeusing namespace std;list factorlist;void FindFactor(int n,int sum,int result){ if(sum <= 0 || n <=原创 2013-04-06 14:34:08 · 493 阅读 · 0 评论 -
贪心算法---0/1部分背包问题
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大 选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。 因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解决。首先计算每种物品单位重量的价值V/W,然后按单原创 2013-04-02 18:17:03 · 815 阅读 · 0 评论 -
动态规划----矩阵链乘法
矩阵连乘问题,一个很经典的DP问题。用DP解这道题的时候,需要找到递归方程,也就是下面这条其中m[i][j]代表的是矩阵Mi....Mj之间的乘法的最小次数.根据这个来写代码,就清晰多了。代码如下:#includeusing namespace std;void Matrix_Chain_Order(int *p,int (*matrix)[7],原创 2013-04-02 16:42:50 · 629 阅读 · 0 评论 -
贪心算法---活动选择问题
活动选择问题:就是给定一组活动的开始时间和结束时间,然后他们都需要使用到一个资源,这个资源每次只有一个活动可以用,要求求出一个最大的相互兼容的活动子集。首先定义了一个集合Sij = {ak∈ S :fi ≤ sk fk ≤ sj} , 其中S就是所有活动的集合,fi是活动ai的完成时间si是活动ai的开始时间。这道题如果是用DP来解的话,就需要找到最优解的递归方程(其中c[i原创 2013-04-02 17:13:25 · 882 阅读 · 0 评论 -
贪心算法---哈夫曼编码
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。贪心算法的基本要素对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定原创 2013-04-02 18:28:34 · 1342 阅读 · 0 评论 -
数组循环左移k次
把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)分析与解法假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位,比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换过程通过以下步骤完成:1.逆序排列 abcd: abcd1234 -> dcb原创 2013-04-03 07:59:51 · 852 阅读 · 0 评论 -
动态规划--LIS(nlogn实现,轮船问题或建桥问题)
轮船问题(ship.pas)【问题描述】某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。每一对友好城市都希望有一条航线来往,于是他们向政府提出了申请。由于河终年有雾。政府决定允许开通的航线就互不交叉(如果两条航线交叉,将有很大机会撞船)。兴建哪些航线以使在安全条件下有最多航线可以被开通。【输入格原创 2013-04-02 17:09:44 · 2095 阅读 · 0 评论 -
面试题---两数之和
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。 如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。代码如下:#includeusing namespace std;/*s原创 2013-04-02 19:00:02 · 556 阅读 · 0 评论 -
动态规划---0/1背包问题
0/1背包问题 1. 问题描述 给定一个载重量为m,n个物品,其重量为wi,价值为vi,1原创 2013-04-02 18:14:24 · 627 阅读 · 0 评论 -
动态规划---LCS最长公共子序列
LCS问题即 longest common subsequence 最长公共子序列问题,也是经典的DP问题。做这道题目的时候依旧是和做其他DP题目一样,按照步骤,先找到最优子结构,然后确定递归方程,然后就是填表和计算了。given a sequence X = 〈x1, x2, ..., xm〉, we define the ith prefix of X, for i =原创 2013-04-02 16:46:51 · 501 阅读 · 0 评论 -
动态规划---LIS
求最长上升子序列个数 严格上升典型的DP 动态规划。A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), w原创 2013-04-02 16:56:41 · 652 阅读 · 0 评论 -
十道海量数据处理面试题与十个方法大总结
第一部分、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。 再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多原创 2013-04-16 09:42:46 · 560 阅读 · 0 评论