随笔分类 -  算法导论

5个数6次比较找中位数,7次比较排序 [转]
摘要:[转]http://blog.csdn.net/myscnu/article/details/43236471 int compare6(int a,int b,int c,int d,int e){2 if(a<b)swap(a,b);3 if(c<d)swap(c,d);4 if(a<c){swap(a,c);swap(b,d);}5 if(b<e)swap(b,e);6 if(b<c){swap(b,c);swap(d,e);}7 if(e<c) return c;8 else return e;9 }7次比较排序:见http://... 阅读全文

posted @ 2013-03-06 19:46 龙豆 阅读(546) 评论(0) 推荐(0) 编辑

最长单调递增子序列 [转]
摘要:[转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列ai1<=ai2<=…<=aim, (其中i1<i2<…<im)即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。 直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出其中单调递增的序列,然后返回其中最长的,这样我们的问 阅读全文

posted @ 2012-03-06 17:10 龙豆 阅读(2693) 评论(0) 推荐(2) 编辑

二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
摘要:本文着重讨论由Rabin-Karp算法推广到二维来解决二维模式匹配问题的算法。问题: 在一个n1*n2的二维字符组成中搜寻一个给定的m1*m2的模式。参考《算法导论》习题32.2-3.分析: 1. 首先简单介绍一下Rabin-Karp算法 Rabin-Karp算法是一种字符串匹配算法,它的主要思想是预先计算出模式串的hash值,匹配时再计算出待匹配子串的hash值,直接比较模式串和当前子串的hash值是否相等即可判断是否匹配。为了便于说明,以下以数字串为例(字符串的每个字符都是一个十进制的数字,比如字符串31415)。已知一个模式P[1..m],设p表示其相应的 十进制数的值。类似的,对于给定 阅读全文

posted @ 2011-10-05 10:33 龙豆 阅读(4292) 评论(0) 推荐(0) 编辑

最大流的算法小结 Algorithm for Maximum Flow
摘要:【转】————————————————————————————算法名称 复杂度概要增广路方法 Augmenting path method (Ford Fulkerson method)一般增广路算法Labeling algorithmO(nmU)在残留网络中,每次任意找一条增广路径增广。容量缩放增广路算法 Capacity scaling algorithmO(nm logU)在残留网络中,每次找一条有最大可增广容量和的增广路径增广,即残留网络中源到汇的最长路。最短增广路算法 Shortest augmenting path algorithm (Edmonds Karp algorithm 阅读全文

posted @ 2011-08-14 16:47 龙豆 阅读(1102) 评论(0) 推荐(0) 编辑

关于最小生成树的一些理解
摘要:Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 【转】(1) 定义在一棵树里添加一条边,并在产生的圈里删除一条边叫做一次操作。(也就是说换掉一条边并且保证结果是树),则树A和B是无向图的两个生成树,则A可以通过若干次操作变成B。 证:把树看作边的集合,如果B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。注:这个命题比较容易证,它告诉我们任何两棵生成树都可以通过不断换边得到。(重要的是换边的过程中始终保. 阅读全文

posted @ 2011-08-09 21:05 龙豆 阅读(1511) 评论(0) 推荐(0) 编辑

算法导论-18.3-2 B-TREE-DELETE的伪代码
摘要:【转】————————————————————————————————————————————————————《算法导论》练习18.3-2: 请写出B-TREE-DELETE的伪代码。与插入情况相对称,除了根结点外(根结点个数不能少于1),B树的关键字数不能少于t-1个。对于简单删除情况,如果我们定位到关键字处在某个结点中,如果这个结点中关键字个数恰好是t-1个,如果直接删除这个关键字,就会违反B树规则。此时,需要考虑两种处理方案:1)把这个结点与其相邻结点合并,合并时需要把父结点的一个关键字加进来,除非相邻的那个结点的关键字数也是t-1个,否则,合并后会超出2t-1的限制,同样违反B树规则。 阅读全文

posted @ 2011-08-09 10:50 龙豆 阅读(2962) 评论(5) 推荐(0) 编辑

算法导论-22.3-6 用栈实现DFS
摘要:自己写的一个:#include <iostream>#include <stack>using namespace std;const int maxV = 100, white = 0, gray = 1, black = 2;int v, itime;struct SNode{ //节点 int color, d, f, num; SNode *p;};struct SAdj{ //邻接表 int num; SAdj *next;};SAdj *adj[maxV];SNode *vertex[maxV];stack<SNode*> vertexStack 阅读全文

posted @ 2011-08-05 20:30 龙豆 阅读(2520) 评论(0) 推荐(1) 编辑

算法导论-9.3-7
摘要:【转】题目:给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数。——————————算法思想:1.找到数组a中第n/2小的数median;2.对a中非median数进行|a[i] - median|,得到一个大小为n - 1的数组distance;3.寻找distance中第k小的数值;4.对distance进行一次遍历,找到小于等于k的数,从而对应得到数组a中的k个数。上述每一步的时间复杂度都为O(n),因而最后总的时间复杂度为O(n).#include <iostream>#include <t 阅读全文

posted @ 2011-07-28 12:06 龙豆 阅读(384) 评论(0) 推荐(0) 编辑

算法导论-15-7 达到最高效益的调度
摘要:【转】问题:假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。——————————分析:其实这个问题类似于01背包问题。1. 将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0= 阅读全文

posted @ 2011-07-27 10:45 龙豆 阅读(3565) 评论(2) 推荐(0) 编辑

算法导论-15.5-4
摘要:Exercises 15.5-4 Knuth has shown that there are always roots of optimal subtrees such that root[i,j-1]<=root[i,j]<=root[i+1,j] for all 1<=i<=n. Use this fact to modify the OPTIMAL-BST procedure to run in Θ(n^2) time.—————————————————————————————————————————————————— First prove this fact 阅读全文

posted @ 2011-07-27 09:36 龙豆 阅读(1465) 评论(0) 推荐(0) 编辑

红黑树实现
摘要:/* * RED-BLACK-TREE * */#include <cstdio>using namespace std;const int MAXN = 10000;const int RED = 0, BLACK = 1, ROOT = 0;struct SData{ int key, color; SData *left, *right, *p;};SData *rbtree[MAXN];SData *nil = new SData;void ini(){ nil->color = BLACK; rbtree[ROOT] = nil;}SData *rb_minimum 阅读全文

posted @ 2011-07-21 21:37 龙豆 阅读(520) 评论(0) 推荐(1) 编辑

算法导论-14.1-8
摘要:【题目】现有一个圆上的n条铉,每条铉都是按其端点来定义的。请给出一个能在O(n log n)的算法,确定圆内相交铉的对数(例如:如果n条铉都是直径,他们交于圆心,则正确的答案为C(n,2),组合数)。另外任意两条铉没有公共点。【解答】[转] 通过角度来判断两条弦是否相交,这样可以在O(n*logn)内完成。 对于两条弦P1P2和Q1Q2来说(顺时针),圆心与端点形成的向量有一个角度A 如果A(P1)<A(Q1)<A(P2)<A(Q2)或者A(Q1)<A(P1)<A(Q2)<A(P2),这样角度区间“交叉”就意味着两条弦有交叉。 通过角度来统计交叉弦的对数,和 阅读全文

posted @ 2011-07-20 16:31 龙豆 阅读(884) 评论(0) 推荐(1) 编辑

算法导论-13.2-4
摘要:Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】首先证明任意的二分查找树可通过至多n-1次旋转变成右行链: 从根开始,反复对根节点执行right-rotate直到根的左子树中的节点都处于根的右行链中;沿着右行链遍历,找到原来树中根节点的右儿子,遍历过程中对每个节点执行right-rotate操作直到该节点没有左子树;对原来根的右孩子执行同样的操作,反复进行right-rotate操作;所有可能的right-rotate有n-1个由对称性可知右行链可通过至多n-1次旋转变. 阅读全文

posted @ 2011-07-18 22:02 龙豆 阅读(585) 评论(0) 推荐(0) 编辑

算法导论-7-6 对区间的模糊排序
摘要:【转】《算法导论》chapter7 problem7-6对区间的模糊排序考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2≤…≤cn .a)为n个区间的模糊排序设计一个算法,你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各ai ),也要能充分利用 阅读全文

posted @ 2011-07-15 22:20 龙豆 阅读(1981) 评论(0) 推荐(1) 编辑

算法导论-5.1-2
摘要:【转】描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少?这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,若产生的整数位于[0, n-1]内,则取这个数作为结果。如果这个数在[0,n-1]外,则丢弃它,再次运行算法重新生成一个。 a) 证明上述算法可以产生 [0, n-1]范围内的随机数在范围[0,1, ..., n-1, n, .. 阅读全文

posted @ 2011-07-15 21:57 龙豆 阅读(933) 评论(0) 推荐(0) 编辑

算法导论-4-6 VLSI芯片测试
摘要:【转】问题:Diogenes 教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的.教授的测试装置一次可测试二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏.一个好的芯片总能够正确的报告另一片的好坏,但一个坏的芯片的结果就是不可靠的.这样,每次的测试的四种可能结果如下: a)证明若少于 n/2 的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯片是好的.b)假设有多于 n/2 的芯片是好的,考虑从 n 片中找出一片好芯片的问题.证明 n/2 对测试就足以使问题的规模降至近原来的一半.c)假设有多于 n/2 的芯片是好的,证明好的芯片可用 O(n) 阅读全文

posted @ 2011-07-15 19:32 龙豆 阅读(2792) 评论(0) 推荐(0) 编辑

算法导论-4-2 找出所缺的整数
摘要:【转】 问题: 某数组A[1..n]含有所有从0..n的所有整数,但其中有一个整数不在数组中,通过利用一个辅助数组B[0..n]来记录A中出现的整数,很容易在O(n)时间内找出所缺的整数。但在这个问题中,我们却不能由一个单一操作来访问A中的一个完整整数,因为A中元素是以二进制表示的。我们所能用的唯一操作就是“取A[i]的第j位”这个操作所花时间为常数。证明:如果访问数组A中信息的唯一方式是这种单一位操作,仍能在O(n)时间内找出所缺的整数。A之外的任一完整整数仍然可以由一个单一操作来访问。【算法导论 中文版P504-2】 昨天晚上看算法导论看到了这一题,没有想多久,没想通。当时想的是把A中的每 阅读全文

posted @ 2011-07-15 19:19 龙豆 阅读(2325) 评论(1) 推荐(1) 编辑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示