2011年4月11日

算法导论8-4习题解答

摘要: CLRS 8-4 :水壶比较问题解答:a)两个for循环即可,O(n^2);b)不会证明,略;c)算法思想:1.由于相同颜色的瓶子不能比较,因而不能对红色瓶子或者蓝色瓶子进行内部排序。2.随机从红色瓶子抽取一个瓶子(实现时选的是中间瓶子),然后与蓝色瓶子进行比较,找到那个相等的蓝色瓶子,它们就是配对的,小于这个红色瓶子的就存在一个数组内,大于这个红色瓶子的就存在另外一个数组内,用得到的蓝色瓶子再和红色瓶子组进行比较,将小于这个蓝色瓶子的存在一个数组内,大于这个蓝色瓶子的存在另一个数组内。3.对得到的两组小的红色瓶子和蓝色瓶子重复2过程,对得到的两组大的红色瓶子和蓝色瓶子重复2过程,即递归。代码 阅读全文

posted @ 2011-04-11 21:02 NULL00 阅读(1313) 评论(0) 推荐(0) 编辑

2011年4月9日

算法导论8-3(b)习题解答(trie树)

摘要: CLRS 8-3(b) : 给定一个字符串数组,其中不同的串包含的字符数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序。算法思想:1.在这里用空间来换取时间,因而采用trie树,即字典树,顾名思义,像一本字典一样。2.将每个字符串插入到trie树中,到达特定的结尾节点时,在这个节点上进行标记,如插入"afb",第一个字母为a,沿着a往下,然后第二个字母为f,沿着f往下,第三个为b,沿着b往下,由于字符串最后一个字符为'\0',因而结束,不再往下了,然后在这个节点上标记afb.count++,即其个数增加1.3.通过前序遍历此树 阅读全文

posted @ 2011-04-09 13:13 NULL00 阅读(1409) 评论(0) 推荐(0) 编辑

2011年4月1日

算法导论8-3(a)习题解答(基数排序)

摘要: CLRS 8-3(a) :给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序。算法思想:1)先把各个数字按位数分组。2)然后对各个分数进行基数排序3)将各个组连接起来即可这个题目基本上重复了算法导论8.3-4习题解答(基数排序) 的核心算法.#include <iostream>#include <fstream>usingnamespace std;void radix_sort(int* a, constint d, constint length, int radix);int 阅读全文

posted @ 2011-04-01 11:27 NULL00 阅读(1285) 评论(0) 推荐(0) 编辑

最短子序列(最短摘要)

摘要: 题目:有一段广告,它由很多单词构成,然后它有个摘要,即关键字,问包含摘要(关键字)的在广告正文中的最短字符串是什么? 简而言之,就是说求在原字符串中包含所有关键字的最短子序列。算法思想: 将每个关键字在原字符串中位置记录在一个数组中,每个关键字对应一个数组,然后令distance = max(a[i], b[j], c[k]) - min(a[i], b[j], c[k]),然后最小的那个元素被它所在数组的下一个元素取代,依次循环下去。这里假设是三个关键字,然后就有三个数组。#include <iostream>using namespace std;int max(int a, 阅读全文

posted @ 2011-04-01 11:16 NULL00 阅读(1445) 评论(0) 推荐(0) 编辑

2011年3月23日

算法导论8.3-4习题解答(基数排序)

摘要: CLRS 8.3-4 :说明如何在O(n)时间内,对0到n^2 - 1之间的n个整数进行排序。算法思想:1.把这n个数看成n进制数,那么每个数只有两位,因而循环只需两次2.调用通用的基数排序(在这写着,留着以后用)在此题中,我选择n = 15, 即数组中有15个数,依次为0, 3, 8, ..., 224,但是将顺序打乱了。PS:在前一篇文章中,计数排序的总时间为O(k+n),在实践中,如果当k = O(n)时,我们常常采用计数排序,这时其运行时间为O(n).在这里采用的是基数排序,在实践中,其排序时间为O(d*(n+k)),但很耗内存,有时甚至比快速排序更快,具体应用再看。#include 阅读全文

posted @ 2011-03-23 20:59 NULL00 阅读(2036) 评论(0) 推荐(0) 编辑

2011年3月22日

算法导论8.2-4习题解答(计数排序)

摘要: CLRS 8.2-4 :在O(1)的时间内,回答出输入的整数中有多少个落在区间[a...b]内。给出的算法的预处理时间为O(n+k)算法思想:利用计数排序,由于在计数排序中有一个存储数值个数的临时存储区C[0...k],利用这个数组即可。#include <iostream>usingnamespace std;//通过改编计数排序而来,因为有些部分需要注释掉void counting_sort(int*&a, int length, int k, int*&b, int*&c);int main(){ constint LEN =100; int*a =n 阅读全文

posted @ 2011-03-22 21:25 NULL00 阅读(1214) 评论(0) 推荐(0) 编辑

2011年3月21日

算法导论7.1-4习题解答(快速排序)

摘要: CLRS 7.1-4:应如何修改QUICKSORT,才能使其按非增序进行排序?算法思想:改掉书上partition算法中的<=为>=#include <iostream>usingnamespace std;void quick_sort(int*&a, int p, int r);int partition(int*&a, int p, int r);int main(){ constint LEN =20; int b[LEN] = {12, 43, 0, -4, 98, 75, 64, 88, 5, 32, 11, 12, 13, 84, 34, 阅读全文

posted @ 2011-03-21 21:50 NULL00 阅读(1145) 评论(0) 推荐(0) 编辑

算法导论6-3习题解答(Young氏矩阵)

摘要: CLRS 6-3 :Young氏矩阵( 杨氏矩阵)解答:(a)2 4 9 12 3 5 14 Max 8 16 Max Max Max Max Max Max(b)Y[1, 1]为Max的话,那么按照Young氏矩阵定义,矩阵中其他数值必然大于等于它,所以Y为空。 若Y[m, n] < Max的话,由其他元素都小于等于Y[m, n]可知此矩阵是满的。(c)算法思想: 1)A[0][0]必然是最小值,将其取出,然后将矩阵的最后一个元素A[m-1[n-1]补到第一位来,并将A[m-1[n-1]设置为Max 2)将A[0][0]与A[0][1]和A[1][0]二者之间的最小值进行交换, 3)若 阅读全文

posted @ 2011-03-21 17:56 NULL00 阅读(2373) 评论(1) 推荐(1) 编辑

算法导论6-1习题解答

摘要: CLRS 6-1 :1.当输入数组相同时,过程BUILD-MAX-HEAP和BUILD-MAX-HEAP'产生的堆是否总是一样的?解答:这个可以用举反例的方式来反驳之。如数组为{1, 2, 3, 4, 5}按照BUILD-MAX-HEAP的方式为: 1 1 5 2 3 -> 5 3 -> 4 3 4 5 4 2 1 2按照BUILD-MAX-HEAP'的方式为: 2 3 4 5 1 -> 1 -> 1 2 -> 3 2 -> 4 2 1 1 32.简单说明:BUILD-MAX-INSERT的时间为lgn,而for循环运行了了n-1次,所以总时 阅读全文

posted @ 2011-03-21 10:05 NULL00 阅读(752) 评论(1) 推荐(0) 编辑

2011年3月20日

算法导论6.5-8习题解答(最小堆K路合并)

摘要: CLRS 6.5-8 原题为:请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)。 算法思想:1. 从k个链表中取出每个链表的第一个元素,组成一个大小为k的数组arr,然后将数组arr转换为最小堆,那么arr[0]就为最小元素了2. 取出arr[0],将其放到新的链表中,然后将arr[0]元素在原链表中的下一个元素补到arr[0]处,即arr[0].next,如果 arr[0].next为空,即它所在的链表的元素已经取完了,那么将堆的最后一个元素补到arr[0]处,堆的大小自动减一,循环n-k次即可 阅读全文

posted @ 2011-03-20 20:12 NULL00 阅读(1964) 评论(0) 推荐(0) 编辑

算法导论6.5-7习题解答

摘要: CLRS 6.5-7: HEAP-DELETE(A, i)操作将结点i中的项从堆A中删去。对含n个元素的最大堆,请给出时间为O(lgn)的HEAP-DELETE的实现。算法思想:对即将被删的i处的元素设置为堆中末尾的元素,同时堆的大小减1.此题同时附带6.2-5的解答代码如下: 1 #include <iostream> 2 using namespace std; 3 //修正i的位置,在此处已经假设i的子节点都是堆 4 static void max_heapify(int*&a, int i, int length); 5 //建立数组的堆 6 void build_ 阅读全文

posted @ 2011-03-20 20:06 NULL00 阅读(1418) 评论(0) 推荐(0) 编辑

算法导论6.3-3习题解答

摘要: CLRS 6.3-3:证明:在任一含n个元素的堆中,至多有[n/2^(h+1)]个高度为h的结点。证明:运用归纳证明1.所有叶子结点的高度都为0,那么h = 0, [n/2^(h+1)] = [n/2],显然成立,因为叶子结点的序号是[n/2] + 1, [n/2] + 2, ..., n,见6.1-7的习题解答,http://www.cnblogs.com/shuaiwhu/archive/2011/03/20/2065081.html2.若h = x时成立,则需证明h = x + 1也成立,易得证。 阅读全文

posted @ 2011-03-20 20:02 NULL00 阅读(1017) 评论(0) 推荐(0) 编辑

算法导论6.2-5习题解答(堆排序)

摘要: CLRS 6.2-5:请用迭代的控制结构(循环)取代递归结构,从而写一个更为高效的MAX-HEAPIFY.这道题的解法包含在6.5-7中了,请参见本博客下下篇,http://www.cnblogs.com/shuaiwhu/archive/2011/03/20/2065078.htmls 阅读全文

posted @ 2011-03-20 19:54 NULL00 阅读(581) 评论(0) 推荐(0) 编辑

算法导论6.1-7习题解答

摘要: CLRS 6.1-7 :证明:当用数组表示存储了n个元素的堆时,叶子结点的下标是[n/2] + 1, [n/2] + 2, ..., n.证明:因为有n个元素,最后一个元素序号为n,那么它的parent结点应该是序号最大的parent结点,那么这个parent结点就为[n/2],其之后都是叶子结点,因而为[n/2] + 1, [n/2] + 2, ..., n。 阅读全文

posted @ 2011-03-20 19:50 NULL00 阅读(1893) 评论(1) 推荐(0) 编辑

算法导论6.1-2习题解答

摘要: CLRS 6.1-2 :证明:含n个元素的堆的高度为[lgn].证明:因为 2^h <= n <= 2^(h+1) - 1 所以 lg(n+1) -1 <= h<= lg(n) 可推出lg(n) - 1 < lg(n+1) -1 <= h<= lg(n) 从而h = [lgn]. 阅读全文

posted @ 2011-03-20 19:44 NULL00 阅读(571) 评论(0) 推荐(0) 编辑

导航