05 2012 档案

算法导论16.2-2 0-1背包问题
摘要:CLRS 16.2-2 请给出一个解决0-1背包问题的运行时间为O(nW)的动态规划方法,其中,n为物品的件数,W为窃贼可放入他的背包中的物品中的最大重量。我们有n种物品,物品j的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为:maximize subject to 方法一:采用最原始的递归方法,公式为V(1,...,n) = max(vk + V(1,...,k-1,k+1,...,n));时间复杂度为O(2n),很多子问题被重复计算。View Code 1 #i... 阅读全文

posted @ 2012-05-18 15:22 NULL00 阅读(5402) 评论(2) 推荐(0)

算法导论16.1-3 区间图着色(interval-graph coloring)问题(贪心算法)
摘要:CLRS 16.1-3假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。(这个问题也被成为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不相同,所需的最少颜色对应于找出调度给定的所有活动所需的最少教室数。)方法一:我们很容易就可以想到用P227页的GREEDY-ACTIVITY-SELECTOR(s, f)来解决这个问题,首先调用这个函数,得到可以兼容的最大活动数,然后再在余下的活动中再次调用 阅读全文

posted @ 2012-05-15 15:11 NULL00 阅读(10563) 评论(4) 推荐(3)

算法导论15-1双调欧几里得旅行商问题 & 15-2整齐打印
摘要:CLRS 15-1 双调欧几里得旅行商问题欧几里得旅行商问题是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题。如图(a)给出了一个7个点问题的解。这个问题的一般形式是NP完全的,故其解需要多于多项式的时间。J. L. Bentley建议通过只考虑双调旅程来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了同样的7个点的最短双调路线。在这种情况下,多项式的算法是可能的。事实上,存在确定的最优双调路线的O(n2)时间的算法。描述一个确定最优双调路线的O(n2)时间的算法。可以假设任何两点的x坐标都不相同。(提示:从左到右扫描,保持 阅读全文

posted @ 2012-05-13 12:47 NULL00 阅读(4924) 评论(1) 推荐(0)

算法导论14-2习题解答 Josephus排列(约瑟夫环)
摘要:CLRS 14-2Josephus问题的定义如下:假设n个人排成环形,且有以正整数m<=n。从某个制定的人开始,沿环报数,每遇到第m个人就让其出列,且报数进行下去。这个过程一直进行到所有人都出列为止。每个人出列的次序定义了整数1,2,...,n的(n, m)-Josephus排列。例如,(7,3)-Josephus排列为<3,6,2,7,5,1,4>。a)假设m为整数。请描述一个O(n)时间的算法,使之对给定的整数n,输出(n, m)-Josephus排列。b)假设m不是个常数。请描述一个O(nlgn)时间的算法,使给定的整数n和m,输出(n, m)-Josephus排列。解 阅读全文

posted @ 2012-05-10 14:01 NULL00 阅读(4511) 评论(4) 推荐(0)

算法导论14.1节习题解答
摘要:算法导论习题解答系列停了一年了,现在重新拾起,好多算法已经忘了,有的记得大概,但是真正的用代码实现却很难下手。CLRS 14.1-3 写出OS-SELECT的非递归形式一般递归形式改写为非递归形式要用到while,有时还要用到栈结构。OS-SELECT(x, i){ r = size[left[x]] + 1; while (r != i) { if (i < r) { x = left[x]; r = size[left[x]] + 1; } else { x = right[x]; i = i -r; r... 阅读全文

posted @ 2012-05-08 18:20 NULL00 阅读(5204) 评论(3) 推荐(1)

treap(树堆)
摘要:一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数。假设所有的优先级是不同的,所有的关键字也是不同的。treap的结点排列成让关键字遵循二叉查找树性质,并且优先级遵循最小堆顺序性质:1.如果v是u的左孩子,则key[v] < key[u].2.如果v是u的右孩子,则key[v] > key[u].3.如果v是u的孩子,则priority[u] > priority[u].这两个性质的结合就是为什么这种树被称为“treap”的原因,因为它同时具 阅读全文

posted @ 2012-05-06 13:06 NULL00 阅读(12714) 评论(1) 推荐(0)

Trie树|字典树(字符串排序)
摘要:有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n)。Trie树又名字典树,从字面意思即可理解,这种树的结构像英文字典一样,相邻的单词一般前缀相同,之所以时间复杂度低,是因为其采用了以空间换取时间的策略。下图为一个针对字符串排序的Trie树(我们假设在这里字符串都是小写字母),每个结点有26个分支,每个分支代表一个字母,结点存放的是从root节点到达此结点的路经上的字符组成的字符串。将每个字符串插入到trie树中,到达特定的结尾节点时,在这个节点上进行标记,如插入"afb",第一个字母为a 阅读全文

posted @ 2012-05-05 13:04 NULL00 阅读(9176) 评论(4) 推荐(3)

判断单链表是否有环的两种方法
摘要:如图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等。方法一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环方法二:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环。代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define LEN 8 5 typede 阅读全文

posted @ 2012-05-03 14:06 NULL00 阅读(16822) 评论(2) 推荐(1)

导航