2012年6月20日

N个鸡蛋放进M个篮子问题

摘要: 题目:有N个鸡蛋和M个篮子,把鸡蛋放到M个篮子里,每个篮子都不能为空。另外,需要满足:任意一个小于N的正整数,都能由某几个篮子内蛋的数量相加的和得到。写出程序,使得输入一个(N,M),输出所有可能的分配情况。从题意中应该可以得出,对于(1,1,2,2)和(1,2,1,2)这两种组合,应该是一样的。因而对于这M个篮子中的鸡蛋数量,我们用数组basket[M]来表示,我们按照非递减顺序进行排列,即basket[i] <= basket[i+1]1.我们利用归纳法来总结出一个规律: 对于前n个篮子,其鸡蛋数量总和为Sn,那么对于第n+1个篮子,其鸡蛋数量应该满足: basket[n+1] &l 阅读全文

posted @ 2012-06-20 14:25 NULL00 阅读(6759) 评论(4) 推荐(2) 编辑

2012年5月18日

算法导论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 阅读(5372) 评论(2) 推荐(0) 编辑

2012年5月15日

算法导论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 阅读(10362) 评论(4) 推荐(3) 编辑

2012年5月13日

算法导论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 阅读(4860) 评论(1) 推荐(0) 编辑

2012年5月10日

算法导论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 阅读(4446) 评论(4) 推荐(0) 编辑

2012年5月8日

算法导论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 阅读(5141) 评论(3) 推荐(1) 编辑

2012年5月6日

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 阅读(12672) 评论(1) 推荐(0) 编辑

2012年5月5日

Trie树|字典树(字符串排序)

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

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

2012年5月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 阅读(16781) 评论(2) 推荐(1) 编辑

2012年4月27日

POJ 1753 Flip Game (递归枚举)

摘要: POJ 1753,题目链接http://poj.org/problem?id=1753,翻译一下整个题目的大概意思:有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使4*4的正方形变为纯白或者纯黑?主要思路如下:1.对于每个格子,它要么反转0次,要么反转1次(当然,它的邻格子也跟着反转),因为它反转偶数次和反转0次的效果是一样的,同理反转奇数次的效果和反转1次的效果是一样的。2.由于只有16个格子,我们可以选择0个格子,1个格子,2个格子,3个格子..... 阅读全文

posted @ 2012-04-27 19:44 NULL00 阅读(24317) 评论(2) 推荐(1) 编辑

从数组中取出n个元素的所有组合(递归实现)

摘要: 今天在做POJ 1753时,需要枚举一个数组中所有组合。之前也遇到过类似的问题,如求从n个数组任意选取一个元素的所有组合都是想起来比较简单,但是设计成算法却颇费周折。如数组为{1, 2, 3, 4, 5, 6},那么从它中取出3个元素的组合有哪些,取出4个元素的组合呢?比如取3个元素的组合,我们的思维是:取1、2,然后再分别取3,4,5,6;取1、3,然后再分别取4,5,6;......取2、3,然后再分别取4,5,5;......这样按顺序来,就可以保证完全没有重复。这种顺序思维给我们的启示便是这个问题可以用递归来实现,但是仅从上述描述来看,却无法下手。我们可以稍作改变:1.先从数组中A取出 阅读全文

posted @ 2012-04-27 16:35 NULL00 阅读(39747) 评论(4) 推荐(6) 编辑

2012年4月25日

散列表(Hash Table)总结

摘要: 复习了下散列表(Hash Table),总结如下:1.直接寻址表 直接送数组进行对应,但是当要存储的关键字集合K相对于域U很小时,就会很浪费空间。2.散列表 利用Hash函数进行映射 “碰撞”发生时,利用链接法解决3.散列函数的选择 3.1除法散列表 h(k) = k mod m,m是与2的整数幂不太接近的质数 3.2乘法散列表 h(k) = 【m*(k*A mod 1)】向下取整,其中A最好取0.618....... 3.3全域散列 ha,b(k) = ((a*k + b) mod p) mod m,a属于{1, 2 ..., p-1},b属于{0, 1 ..., p-1}... 阅读全文

posted @ 2012-04-25 14:45 NULL00 阅读(1152) 评论(3) 推荐(0) 编辑

2012年4月22日

POJ 1177 Picture (线段树+离散化+扫描线) 详解

摘要: POJ 1177 (线段树+离散化+扫描线),题目链接为http://poj.org/problem?id=1177在做本题之前,必须先了解什么是线段树和离散化,请看前一篇博文线段树(segment tree),里面对线段树和离散化的说明相对比较清楚了。对于这题,我们的思路步骤如下(代码和下面的文字解释结合着看):1.对于输入的N个矩形,有2*N条纵向边,我们把这些边叫做扫描线2.建立一个struct ScanLine,保留这些扫描线struct ScanLine{ int x;//横坐标 int y1;//扫描线的下端点 int y2;//扫描线的上端点 int flag;//若该扫... 阅读全文

posted @ 2012-04-22 12:49 NULL00 阅读(7467) 评论(5) 推荐(5) 编辑

线段树(segment tree)

摘要: 线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树:(PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本性质和操作线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。线段树T(a,b)也可递归定义为:若L>1 : [a, (a+b) div 2]为 T的左儿子; [(a+b) div 2,b]为T 的右儿子。 若L=1 : T为叶子节点。线段树中的结点一般采取如下数据结构:struct Node{ int left... 阅读全文

posted @ 2012-04-22 03:25 NULL00 阅读(41044) 评论(7) 推荐(9) 编辑

2012年4月18日

Emacs入门之常用命令

摘要: 自己装了个Emacs23,把常用命令贴在这里供以后参考,C - v 下一屏M - v 上一屏C - f 往前一个字符C - b 往后一个字符C - p 上一行C - n 下一行M - f 往前一个词M - b 往后一个词C - a 行首C - e 行尾M - a 句首M - e 句尾M - > 文件末尾M - < 文件开头C - u 输入参数如:C - u 8 C - fC - g 取消之前的命令C - x 1 关掉当前文档窗格C - u 8 * 在文本中输入8个*字符Backspace 删除前一个字符C - d 删除光标后一个字符M - Backspace 移除光标前一个词M - 阅读全文

posted @ 2012-04-18 21:07 NULL00 阅读(959) 评论(0) 推荐(0) 编辑

导航