
算法
文章平均质量分 59
huangwwu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
动态规划中的最有子结构和无后效性
【1】最优子结构:对于多阶段决策问题,如果每一个阶段的最优决策序列的子序列也是最优的,且决策序列具有“无后效性”,就可以将此决策方法理解为最优子结构。 【2】无后效性:动态规划法的最优解通常是由一系列最优决策组成的决策序列,最优子结构就是这些最优决策序列中的一个子序列,对于每个子序列再做最优决策会产生新的最优决策(子)序列,如果某个决策只受当前最优决策子序列的影响,而不受当前决策可能产生的转载 2013-07-18 19:35:00 · 5022 阅读 · 0 评论 -
Strassen方法
n*n的矩阵A和B相乘得到C,n是2的幂;普通的分治算法,将A、B和C分解为12个n/2 * n/2的矩阵,进行相乘,需要八次n/2 * n/2矩阵相乘总时间T(n) =θ(1) + 8T(n/2) + θ(n^2),T(1) = θ(1) 总时间T(n) = θ(n^3),与直接计算相同Strassen方法:通过技巧,将子矩阵的计算转化为仅需要七次n/2原创 2015-04-11 21:11:39 · 504 阅读 · 0 评论 -
活动选择问题(动态规划和贪心算法)
有一个由n个活动组成的集合S = {a1, ..., an} 1. 这些活动使用同一个资源,而这个资源在某一时刻只供一个活动使用 2. 每个活动都有一个开始和结束时间si/fi;如果被选中,则任务ai发生在半开时间区间[si, fi) 3. 如果两个活动ai和aj不重叠,则称两个活动兼容 活动选择问题,希望选出一个最大兼容活动集 假设活动已原创 2015-04-11 21:14:56 · 4925 阅读 · 0 评论 -
快速排序
运用了分治思想,三步分治过程 分解:数组A[p...r]被划分为两个子数组A[p...q-1]和A[q+1...r],其中左边数组元素都小于A[q],右边数组都大于A[q] 解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序 合并:不需要合并操作quicksort(A, p, r) q = PARTITION(原创 2015-04-11 21:06:59 · 386 阅读 · 0 评论 -
动态规划
分治法:将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来动态规划:子问题重叠;通常用于求解最优化问题 分治法会做许多重复工作,反复求解公共子问题;而动态规划则对每个子问题只求解一次并保存下来步骤: 1) 刻画一个最优解的结构特征 2) 递归地定义最优解的值 3) 计算最优解的值,通常采用自底向上的方法 4) 利用原创 2015-04-11 21:11:57 · 429 阅读 · 0 评论 -
动态规划原理
最优子结构:一个问题的最优解包含其子问题的最优解 不同问题领域,最优子结构的不同体现在两个方面: 原问题的最优解中涉及多少个子问题 在确定最优解使用哪些子问题时,我们需要考察多少种选择 例:钢条切割问题涉及到一个子问题(长度为n-i的钢条的最优切割),但必须考察i的n中不同取值 两个典型的问题 无权原创 2015-04-11 21:12:24 · 494 阅读 · 0 评论 -
最长公共子序列 (longest common subsequence)
子序列定义:将给定序列中零个或多个元素去掉之后得到的结果 比如abcd是abecd的子序列 最长公共子序列问题:给定两个序列X和Y,求两者长度最长的公共子序列1. 最长公共子序列的特征 X = ,Y = ;Z = 是两者的任意LCS 1) 如果xm = yn, 则zk = xm = yn且Zk-1是Xm-1和Yn-1的一个LCS 2原创 2015-04-11 21:13:49 · 602 阅读 · 0 评论 -
多源最短路径
可以简单的通过运行|V|次单源最短路径算法来解决,每次使用一个不同的结点作为源结点多数算法采用邻接矩阵来表示图,因此算法的输入为一个n*n的矩阵W,代表一个有n个结点的有向图G = (V, E)的边的权重wij = 0 若i = j 权重 若i != j,且(i, j)属于E INF 若i !=原创 2015-04-19 18:04:44 · 978 阅读 · 0 评论 -
模取幂(求一个数的幂对另一个数的模运算)
即求a^b mod n的值,a/b为非负整数,n是一个正整数设是b的二进制表示,随着c的值从0到b成倍增长,下面过程最终计算出a ^ b mod nMODULAR-EXPONENTIATION(a, b, n) c = 0 d = 1 //初始化 let be the binary representation原创 2015-04-19 21:57:21 · 2016 阅读 · 0 评论 -
摊还分析
摊还分析——求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价 聚合分析:确定一个n个操作的序列的总代价的上界T(n)【即最坏情况下花费的总时间】,从而每个操作的平均代价为T(n)/n;所有操作具有相同的摊还代价 核算法:分析每个操作的摊还代价;同时将序列中某些较早的操作的“余额”作为“预付信用”保存起来,与数据结构中的特定对象相关联;在序列中随后的部分,保原创 2015-04-12 22:06:10 · 1297 阅读 · 1 评论 -
霍夫曼编码
给定一个文本中出现的一组字符C,每个字符有其出现频率freq,想构造字符的最优二进制表示,即用来编码整个文本的二进制位最少定长编码:每个字符用相同长度的二进制位数进行编码,则每个字符的长度n必须满足,2^n = |C|变长编码:思想是赋予高频字符短码字,赋予低频字符长码字编码过程相对简单,将表示每个字符的码字连接起来即可完成文件压缩解码过程,如果采用的定长编码则直接原创 2015-04-12 11:48:00 · 1147 阅读 · 0 评论 -
高级数据结构
B树——为磁盘或其他直接存储的辅助存储设备而设计的一种平衡搜索树B树T具有如下性质1. 每个结点x有下面属性 a) x.n,当前存储在结点x中的关键字个数 b) x.n个关键字本身x.key1、x.key2、...、x.keyn以非降序排序 c) x.leaf,一个布尔值,如果x是叶结点,则为TRUE,否则为FALSE2. 每个内部结点x原创 2015-04-14 22:03:25 · 710 阅读 · 0 评论 -
最小生成树(贪心算法)
最小生成树问题——连接n个针脚,可以使用n-1根连线,每个连线连接两个针脚,使得所使用的连线长度最短 抽象为图问题,一个连通无向图G = (V, E),V是针脚的集合,E是针脚之间的可能连接,且对于每条边都有权重w(u, v),希望找到一个无环子集,T属于E,权重之和最小通用方法——在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中,管理一个遵守下述循环不变式的边集合原创 2015-04-15 23:38:18 · 2598 阅读 · 0 评论 -
广度优先搜索和深度优先搜索
广度优先搜索——算法始终将已发现节点和未发现结点之间的边界【已访问,但其后继结点没有遍历完】,沿其广度方向向外扩展将每个结点涂上白色、灰色或黑色,所有结点在一开始的时候均为白色;凡是灰色和黑色的结点都是已被发现的结点,但会加以区分 如果边(u, v)属于E且结点u是黑色,则v既可能是灰色也可能是黑色,即与黑色结点邻接的结点都已经被发现 对于灰色结点,其邻接结点可能存在未被发原创 2015-04-15 22:52:59 · 587 阅读 · 0 评论 -
基本的数据结构
栈、队列、链表(单向/双向/循环)、树(二叉树/普通树【左孩子右兄弟表示法】)散列表,普通数组概念的推广,普通数组可以直接寻址,能在O(1)时间内访问数组任意位置;如果存储空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,然而实际存储的关键字数目比全部的可能关键字总数要小,因此采用散列表是一种比较有效的替代方式。散列表不是直接把关键字作为数组的下标,而是根据关键字原创 2015-04-11 21:06:45 · 783 阅读 · 0 评论 -
堆(堆排序)
最大堆:通常用于堆排序;A[parent(i)] >= A[i]最小堆:通过用于构造优先队列一个数组A表示堆,A[i]的左孩子为A[2i],右孩子为A[2i+1]1. MAX-HEAPIFY【维持堆性质】:给定一个数组A和下标i,假定节点i的左子树和右子树都满足最大堆性质,但是i可能不满足; 通过让A[i]的值在堆中逐级下降,使得数组回到满足最大堆性质的过程原创 2015-04-11 21:05:36 · 591 阅读 · 0 评论 -
最优二叉搜索树(动态规划)
假定有一组英语单词与其法语的翻译,要根据英语单词搜索其法语翻译;有以下两个条件 1. 单词的出现频率不同 2. 有些单词没有对应的法语单词,称为伪单词 在给定单词出现频率的前提下,如果组织一棵二叉搜索树,使得所有搜索操作访问的节点总数最少 问题形式化为 给定一个序列,有n个关键字组成:K = {k1, k2, ..., kn},对每个关键字原创 2015-04-11 21:13:50 · 798 阅读 · 0 评论 -
编程之美3.1 扩展
原问题:给定两字符串s1和s2,要求判定s2是否能被s1做循环移位得到的字符串包含解法1:直接对s1作循环移位,再利用strstr()函数判断,效率较低解法2:串接两个s1得到s1s1,从而判断s2是否s1s1的子字符串即可;用空间换时间扩展:1) 先直接判断s2是否s1的子串,是则返回true终止,不是继续2)2) 不需要串接两个s1,只需要将必要的字段接到s1尾部即原创 2014-02-23 19:58:51 · 839 阅读 · 0 评论 -
编程之美4.1 金刚坐飞机问题
问题描述:有一班飞机将要起飞,乘客们正准备按机票号码依次排队登记。突然来了一只大猩猩。他也有飞机票,但是他插队第一个登上了飞机,然后随意地挑了一个座位坐下了。其他乘客的反应如下1) 乘客们都很生气,他们也随意找位置坐下,并坚决不让座给其他乘客2) 乘客们虽然很愤怒,但还是以“和谐”为重,如果自己的座位没被别人坐了,就赶紧坐下;如果自己的座位被坐了,则随机挑选一个位子坐下求第i个乘客坐到原创 2014-02-25 10:39:54 · 1814 阅读 · 0 评论 -
编程之美4.3 买票找零解法二
解法二利用了数学分析的方法得到非法序列和Sigma序列是一一对应的,其中很关键的一步是:在一个非法序列中,存在某个(些)k,使得序列的前k项中1的个数比0的个数刚好少1个原因:1) 若第一位为0,则成立2) 若第一位为1,又该序列为非法序列,因此必然存在某个(些)k,使得在该位上0的个数超过1的个数,此时1的个数刚好比0的个数少1个对于后面Sigma序列原创 2014-02-25 15:10:58 · 950 阅读 · 0 评论 -
编程之美4.5 磁带文件存放优化
对于如何得到的文件平均访问长度我就不多说了,课本中推导得到:前两种情况,若文件的被访问概率相等或者文件长度一样,比较容易理解,也不多说对于第三种情况,课本中只是根据一个例子来进行猜测,而且课本中也出现了一点错误;对于两种情况,排列顺序为AB或BA,第二种文件的P/L应该是0.4/10=0.04以及0.6/6=0.1这里给出一种数学分析方法对于一种原创 2014-02-25 17:10:02 · 946 阅读 · 0 评论 -
编程之美4.6 桶中取黑球
一个桶中有白球、黑球各100个,按照以下规则将球取出来:1:每次从桶里拿两个球2:如果是两个同色的球,就再放入一个黑球3:如果是两个异色的球,就再放入一个白球问最后只剩下一个黑球的概率解法一:每次取球可能有三种情况1) 两个黑球,则再放入一个黑球,总体少了一个黑球2) 两个白球,则再放入一个黑球,总体少了两个白球3) 一黑一白,则再放入一个白球,总体少了原创 2014-02-26 09:33:11 · 1314 阅读 · 0 评论 -
几个时间复杂性类(NP/BPP/RP/ZPP)
1:NP(Non-determinnistic Polynominal Time)——由所有可以在多项式时间内验证解是否正确的决定问题组成即若L属于NP,则存在一个算法A,存在c,在多项式时间O(n^c)时间内可判定1) x属于L,则存在y(相当于一种解决方案,一种证书),,即算法A以x,y作为输入,输出12) x不属于L,则存在y,2:BPP(Bounded error Prob原创 2014-03-26 11:14:51 · 9603 阅读 · 0 评论 -
时间复杂度——均摊分析
首先区分一下均摊分析和原创 2014-05-31 10:52:26 · 12176 阅读 · 1 评论 -
Google of Greater China Test for New Grads of 2014 Round A 第2题
转载请注明来自souldak,微博:@evagle思路真赞Google of Greater China Test for New Grads of 2014 Round A 第2题,题目: Rational Number Tree如下面这颗树,生成规则是,左儿子的分子和父节点一样,分母是父节点分子分母之和,右儿子的分母和父节点一样,分子是父节点分子分母之和。这转载 2014-08-15 16:32:52 · 732 阅读 · 0 评论 -
二叉搜索树
性质:对任何节点x,其左子树中的关键字最大不超过x.key,右子树中的关键字最小不低于x.key 基本操作所花费的时间与树的高度成正比;search/minimum/maximun/predecessor/successor 随机构建一棵二叉搜索树的期望高度为O(lg n)查找【O(h)】TREE-SEARCH(x, k) if x == NI原创 2015-04-11 21:08:39 · 374 阅读 · 0 评论 -
红黑树(二叉搜索树的一种)
满足如下性质: 每个结点或是红色的,或是黑色的 根结点是黑色的 每个叶节点(NIL)都是黑色的 如果一个结点是红色的,则其两个子结点都是黑色的 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 ——>确保没有一条路径会比其他路径长出两倍,是近似于平衡的 一棵有n个内部结点的原创 2015-04-11 21:11:11 · 523 阅读 · 0 评论 -
概率分析和随机算法
概率分析:必须使用或者假设关于输入的分布;如果不能描述一个合理的输入分布,则不能采用概率分析 随机算法:一个算法的行为不仅由输入决定,也由随机数生成器产生的数值决定,则称该算法是随机的 当概率分布式在算法的输入上时,讨论的是平均情况运行时间;当算法本身做出随机选择时,讨论其期望运行时间1. 指示器随机变量,用于计数某个时间发生的次数原创 2015-04-11 21:04:39 · 516 阅读 · 0 评论 -
礼券收集者问题
有b个箱子,把相同的球随机投到这b个箱子里,求使得每个箱子里至少都有一个球,所需的投球次数n 普通的概率分析方法 称一次投球落在空箱子里为“命中”,用ni表示从第i-1次命中到第i次命中需要的头球次数,则 n = n1 + n2 + ... + nb E(ni) = b / b - i + 1; 从而E(n) = E(n1) + E(n2)原创 2015-04-11 21:04:56 · 1022 阅读 · 0 评论 -
计数排序
前提条件:n个输入元素中的每一个都是在0到k区间内的一个整数,当k=O(n)时,运行时间为theta(n)基本思想:对每一个输入元素x,确定小于x的元素个数,从而可以直接把x放到它在输出数组中的位置上了COUNTING-SORT(A, B, k) //A是输入,B是输出let C[0..k] be a new array //原创 2015-04-11 21:07:30 · 368 阅读 · 0 评论 -
单源最短路径
最优子结构——最短路径的子路径也是最短路径,动态规划和贪心算法的一个重要指标。环路 一条最短路径不可能包含环路 1) 环路权重为负,如果有一条环路权重为负,则不存在最短路径 2) 环路权重为零,如果包含该环路,则将该环路去掉即可 3) 环路权重为正,去掉改环路可以得到更短的路径,因此不可能是最短路径最短路径的表示原创 2015-04-17 23:18:57 · 813 阅读 · 0 评论