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 阅读(1967) 评论(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 阅读(1421) 评论(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 阅读(1021) 评论(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 阅读(583) 评论(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 阅读(1897) 评论(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 阅读(576) 评论(0) 推荐(0) 编辑

算法导论2-4习题解答(合并排序算法)

摘要: CLRS 2-4:要求用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。(提示:修改合并排序)算法思想:逆序对,即i a[j],那么我们可以修改合并排序,每次合并时,都把这样的对数记下来即可,因为合并排序是从最底部开始的(书上给出了一个树形图)。代码如下:#include using namespace std;//寻找一个数组中的逆序对//逆序对://i a[j]//算法思想:修改合并排序#define LEN 5void merge(int* a, int p, int q, int r, int&count){ int* left =new int[q-. 阅读全文

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

算法导论2-2习题解答(冒泡算法)

摘要: CLRS 2-2 :冒泡排序算法的正确性解答:这里我只实现了冒泡算法,证明什么的,我也不大会.#include <iostream>usingnamespace std;//冒泡排序#define LEN 35int main(){ int* a =newint[LEN]; for(int i =0; i < LEN; i++) a[i] = i -5; for(int i =0; i < LEN; i++) for(int j = LEN -1; j > i; j--) { if(a[j] > a[j-1]) ... 阅读全文

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

算法导论2.3-7习题解答(合并排序算法及二分查找)

摘要: CLRS 2.3-7:请给出一个运行时间为O(nlgn)的算法,是之能在一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i];代码如下: 1 #include <iostream> 2 using namespace std; 3 4 void sort(int*&a, int p, int q, int r) 5 { 6 int* left =new int[q - p +1]; 7 int* right =new int[r - 阅读全文

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

算法导论2.1-2习题解答(插入排序算法)

摘要: CLRS 2.1-2 :重写过程insertion-sort,使之按非升序排序。算法思想:模仿书中的代码即可,送分题。#include <iostream>using namespace std;#define LEN 17//最坏的情况O(n2)int main(){ int* a = new int[LEN]; for(int i = 0; i < LEN; i++) a[i] = i - 5; int temp = a[0]; for(int i = 1; i < LEN; i++) { int j = i; int key = a[i]; while(j > 阅读全文

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

导航