算法设计与分析课后习题

上传人:腾**** 文档编号:40506134 上传时间:2018-05-26 格式:DOC 页数:8 大小:55.50KB
返回 下载 相关 举报
算法设计与分析课后习题_第1页
第1页 / 共8页
算法设计与分析课后习题_第2页
第2页 / 共8页
算法设计与分析课后习题_第3页
第3页 / 共8页
算法设计与分析课后习题_第4页
第4页 / 共8页
算法设计与分析课后习题_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《算法设计与分析课后习题》由会员分享,可在线阅读,更多相关《算法设计与分析课后习题(8页珍藏版)》请在金锄头文库上搜索。

1、第一章 1. 算法分析题 算法分析题 11 求下列函数的渐进表达式 (1). 3n2 + 10n 5 是,n2 = 1 时,n2/10 n 2 所以: f(n) = (g(n) (8) 因为:f(n) = 2n; g(n) = 3 n; 2 n aArrmiddle)left = middle + 1;elseright = middle - 1; middle = (left + right) / 2; *iIndex = right;*jIndex = left;return 0; 算法分析题 2 6 对任何非零偶数 n,总可以找到奇数 m 和正整数 k,使得 n = m * 2k.为 了

2、求出 2 个 n 阶矩阵的乘积,可以把一个 n 阶矩阵划分成 mm 个子矩阵,每个子矩阵2k2k 个元素。当需要求 2k2k 的子矩阵的积时,使用 Strassen 算法。设计一个传统 方法与 Strasssen 算法相结合的矩阵相乘算法,对于任何偶数 n,都可以求出 2 个 n 阶矩阵 的乘积。并分析算法的计算时间复杂度。 分析与解答: 将 n 阶矩阵分块为 mm 的矩阵。用传统方法求 2 个 m 阶矩阵的乘积需要计算 O(m3)次 2 个 2k2k 矩阵的乘积。用 Strassen 矩阵乘法计算 2 个 2k2k 的矩阵的乘积需要的计 算时间为 O(7k), 因此算法的计算时间为 O(7k

3、*m3).算法分析题 2 - 9 设 T0, n-1是 n 个元素的数组。对任一元素 x,设 S(x) = i | Ti = x . 当 |S(x) | n/2 时,称 x 为 T 的主元素。设计一个线性时间算法,确定 T0:n-1是否有一个主 元素。 分析与解答: 如果 T 有一个主元素 x,则 x 是 T 的中位数。 反之,如果 T 的中位数不是 T 的主元素,则 T 没有主元素。 下面算法设计为在一个线性时间中找中位数:typedef int T;#define YES_MIDDLE_ELEMENT 1#define NO_MIDDLE_ELEMENT 0/* Function name

4、: * IsExistMiddleElement* Parameters:* aArr: 表示数组 T0:n-1* n: 表示数组长度* x: 表示要判断的数 x,是否主元素* *keyIndex: 表示主元素在数组中的下标* Return:* YES_MIDDLE_ELEMENT: 表示找到* NO_MIDDLE_ELEMENT: 表示没有找到*/static int IsExistMiddleElement(T aArr, int n, T x, int *keyIndex)int middleKey = n / 2;int i = 0;for (i = 0; i middleKey)*k

5、eyIndex = i;return YES_MIDDLE_ELEMENT;*keyIndex = -1; return NO_MIDDLE_ELEMENT;算法分析题 2-14 对所给元素存储于数组中和存储于链表中 2 中情形,写出自然合并排序 算法。 分析与解答: 自然合并排序是合并排序算法的一种改进。自然合并排序,对于初始给定的数组,通常存 在多个长度大于 1 的已自然排好序的子数组段。例如,若数组 a 中元素为4,8,7,1,5,6,2,则 自然排好序的子数组段有4,8, 3, 7, 1,5,6, 2.用一次对数组 a 的线性扫描就足以找出所有 这些排好序的子数组段。然后将相邻的排好序

6、的子数组段两两合并,构成更大的排好序的 子数组段3,4,7,8, 1, 2,5,6.继续合并相邻排好序的子数组段,直至整个数组已经排好序。 算法设计及代码实现: (1). 数组实现法: #define DEBUG 1 typedef int type_t; static void DatasetMerge(type_t *arr, int left, int between, int right) int i, k;int begin1, end1, begin2, end2;type_t *tmpArr;begin1 = left; /*第一个排好序的初始位置*/end1 = between

7、; /*第一个排好序的结束位置*/begin2 = between + 1; /*第二个排好序的初始位置*/end2 = right; /*第二个排好序的结束位置*/tmpArr = malloc(sizeof(type_t) * (right - left + 1);if (!tmpArr)return;k = 0;/* 比较两个指针指向的元素,选择相对小的元素放入合并空间* 并移动指针到下一个位置*/while (begin1 arri+1)tmpArrk = i;k+;/* 存储尾分割点*/tmpArrk = n - 1;/* k 和 group 分别记录分割数组长度*/group =

8、k;#if DEBUGprintf(“n 数组分割点为:n“);printf(“t“);for (i = 0; i k)right = k; DatasetMerge(arr, tmpArrleft, tmpArrbetween, tmpArrright);/* 进行生下来的合并*/for (i = 1; i k)right = k;DatasetMerge(arr, tmpArrleft + 1, tmpArrbetween, tmpArrright);s += s;free(tmpArr); (2). 链表实现法: #if LINK typedef struct node *link_t;

9、 struct node int item;link_t next; ;link_t LinkMerge(link_t a, link_t b)link_t c, head;c = head = malloc(sizeof(struct node);while (a != NULL) c = a;a = a-next;elsec-next = b;c = b;b = b-next; c-next = (a = NULL) ? b : a;return head-next; link_t LinkNuturalMergesort(link_t t)link_t a, b;link_t u, v;QUEUE Q;if (t = NULL | t-next = NULL) return t;for (u = t; t != NULL; t = u)while (u v = u;u = u-next;v-next = NULL; Q.ENQUEUE(t);Q.DEQUEUE(t);while (!Q.EMPTY()Q.ENQUEUE(t);Q.DEQUEUE(a);Q.DEQUEUE(b);t = LinkMerge(a, b); return t; #endif

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号