2013年3月13日

算法导论15.1节 装配线调度问题

摘要: View Code #include <stdio.h>int l[2][6] = {0};int f[2][6] = {0};int f1, l1;int fastWay(int a[][6], int t[][5], int *e, int *x, int n) { f[0][0] = e[0] + a[0][0]; f[1][0] = e[1] + a[1][0]; int j; for (j = 1; j < n; j++) { if (f[0][j-1] + a[0][j] <= f... 阅读全文

posted @ 2013-03-13 20:22 愤怒的屎壳螂 阅读(142) 评论(0) 推荐(0) 编辑

2013年3月11日

证明:n个结点的堆中结点i的子树大小至多为2n/3

摘要: 证明:n个结点的堆中结点i的子树大小至多为2n/3堆中结点数目为n,因为做子树数目肯定大于等于右子树数目,所以底层半满时左子树最大(含结点数目最多)假设高度为h的堆底层正好半满,此时左子树高度为0的结点数目为k个,则右子树中与左子树在同一层的结点数目也为k个(此时为空)当对是满二叉树时,结点数目为n+k个,高度1-h之间有2^(h)-1个结点,高度0有2^(h) == 2k个结点,因此结点总数为2^h - 1 + 2^(h) = 4*k-1个结点(2*k = 2^(h))可得:n+k = 4*k -1 n = 3*k - 1左子树结点数目为:(n+k-1)/2 = (4*k-2)/2... 阅读全文

posted @ 2013-03-11 12:37 愤怒的屎壳螂 阅读(553) 评论(0) 推荐(0) 编辑

证明:在任一含n个元素的堆中,至多有ceiling(n/(2^(h+1)))个高度为h的节点

摘要: 证明:在任一含n个元素的堆中,至多有ceiling(n/(2^(h+1)))个高度为h的节点第i(下标为i)个结点无孩子,则2*i > n 得到i > n/2且i=floor(n/2), 此时高度为0的结点个数为ceiling(2^(0+1));--因为小于i的结点+大于i的结点等于n;i为第一个无孩子的结点,则去掉叶结点后i+1即为余下的堆中的元素个数(因为i为下标,元素个数为i+1)因此,去掉叶结点后,设第ii个结点无孩子,则,2*ii > i+1 > i,得到ii> i/2 > n/2^2,且ii = floor(n/2^2), 此时高度为1的结点个数 阅读全文

posted @ 2013-03-11 12:20 愤怒的屎壳螂 阅读(2659) 评论(0) 推荐(0) 编辑

2013年3月10日

主元素问题

摘要: x称为一个长度为n的数组a的主元素,如果这个数组里面等于x的元素数目不少于n/2个。例如,a={2,3,2,2,5,3,2,4,2}, x = 2就是主元素。给定包含n个元素的数组a,主元素问题就是判断数组a是否包含一个主元素x。三方法实现:方法一:求中位数,主元素肯定是中位数,否则该元素数量少于n/2则不是主元素:快速排序,然后确定中位数时间复杂度O(nlogn)方法二:分治的思想:若T中存在主元素,则将T分为两部分后,T的主元素也必为两部分中至少一部分的主元素,因此可用分治法。将元素划分为两部分,递归地检查两部分有无主元素。算法如下:a.若T只含一个元素,则此元素就是主元素,返回此数。b. 阅读全文

posted @ 2013-03-10 14:42 愤怒的屎壳螂 阅读(435) 评论(0) 推荐(0) 编辑

不动点的O(logn)时间算法(王晓东 算法分析2-8)

摘要: 问题描述设n个不同的整数排好序后存于T[1:n]中。若存在下标i,1<=i<=n,使得T[i]=i,设计一个有效算法找到这个下标。要求算法在最坏情况下的计算时间为O(logn).分析与解答:由于n个整数是不同的,因此对任意1<=i<=n-1有T[i]<=T[i+1]-1假设有n个数A1 A2 A3 ... A(i-1) Ai A(i+1) ... An对应下标为 1 2 3 ... i-1 i i+1 ... n如果Ai>i 则,由于下标是连续增长的,整数序列可能不是连续的,所以对于j>=i 有Aj-Ai >= j-i;如果Ai<i则,同理 阅读全文

posted @ 2013-03-10 12:23 愤怒的屎壳螂 阅读(537) 评论(0) 推荐(0) 编辑

2013年3月9日

1-5 最大间隙问题

摘要: 问题描述:最大间隙问题:给定n 个实数x1 , x2 , , xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。编程任务:对于给定的n 个实数 x1 , x2, ……, xn,编程计算它们的最大间隙。数据样例:输入数据:52.3 3.1 7.5 1.5 6.3输出数据:3.2解题思路:1,比较直接的方法是先对n个数进行排序,最快时间为nlogn,然后遍历数据顺便计算每两个数据之间的间隔该方法不是线性时间2,想要用线性时间解决该问题可以使用组合数学中学到的鸽巢原理,将n个数放入n-1个桶中,每个桶大小相同为(max-m 阅读全文

posted @ 2013-03-09 22:01 愤怒的屎壳螂 阅读(983) 评论(0) 推荐(0) 编辑

1-4 金币阵列问题

摘要: 问题描述:有m´ n(m<= 100,n<= 100)个金币在桌面上排成一个m行n 列的金币阵列。每一枚金币或正面朝上或背面朝上。用数字表示金币状态,0表示金币正面朝上,1 表示背面朝上。金币阵列游戏的规则是:(1)每次可将任一行金币翻过来放在原来的位置上;(2)每次可任选2 列,交换这2 列金币的位置。算法设计:给定金币阵列的初始状态和目标状态,计算按金币游戏规则,将金币阵列从初始状态变换到目标状态所需的最少变换次数。数据输入:文件中有多组数据。文件的第1行有1 个正整数k,表示有k 组数据。每组数据的第1 行有2 个正整数m 和n。以下的m行是金币阵列的初始状态,每行 阅读全文

posted @ 2013-03-09 20:54 愤怒的屎壳螂 阅读(248) 评论(0) 推荐(0) 编辑

1-3 最多约数问题

摘要: 问题描述:正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x。问题简化:对于给定的2个正整数a≤b,编程计算a 和 b 之间约数个数最多的数。思想:设正整数x的质因子分解为x=p1^N1 × p2^N2 ×……pi^Ni则 div(x)=(N1+1)(N2+1)……(Ni+1)源代码如下:#include <stdio.h>#define MAXP 10240#define true 1#define f 阅读全文

posted @ 2013-03-09 14:34 愤怒的屎壳螂 阅读(344) 评论(0) 推荐(0) 编辑

2013年3月8日

1-2 字典序问题

摘要: 在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A由26个小写英文字母组成,即A={a,b...z}.该字母表产生的长序字符串是指定字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次.例如,a,b,ab,bc,xyz,等字符串是升序字符串.思想:排列组合问题考察一般情况下长度不超过k的升序字符串设以第i个字符打头的长度k的升序字符串个数位f(i,k),长度k的升序字符串总个数为g(k),则g(k)=累加f(i,k),i从1到26f(i,1)=1 g(1)=累加f(i,1),i从1到26f(i,2)=累加f(j,1)=26-i,j从i+1到26 阅读全文

posted @ 2013-03-08 22:47 愤怒的屎壳螂 阅读(228) 评论(0) 推荐(0) 编辑

1-1 统计数字问题

摘要: 最近学习算法设计与分析,老师推荐王晓东的计算机算法设计与分析,感觉真的很不错,但是第一到算法实现题就给难住了,题目如下(后来发现编程之美上也有这个题目,只是让求1出现的次数):一本书的页码从自然数1开始顺序编码直到自然数n。每个页码不包含多余的前导数字0.给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,。。。9.一下子能想到的笨方法就是遍历1到n之间的每个数字,统计每个页码数中每个数字出现的次数,这样非常慢。代码如下:#include <stdio.h>#include <time.h>int countInteger(int m){ int num 阅读全文

posted @ 2013-03-08 21:07 愤怒的屎壳螂 阅读(277) 评论(0) 推荐(0) 编辑

导航