收藏 分享(赏)

算法设计与分析课后习题.doc

上传人:pw17869 文档编号:6546030 上传时间:2019-04-16 格式:DOC 页数:8 大小:55.50KB
下载 相关 举报
算法设计与分析课后习题.doc_第1页
第1页 / 共8页
算法设计与分析课后习题.doc_第2页
第2页 / 共8页
算法设计与分析课后习题.doc_第3页
第3页 / 共8页
算法设计与分析课后习题.doc_第4页
第4页 / 共8页
算法设计与分析课后习题.doc_第5页
第5页 / 共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*m3).算法分析题 2

3、- 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: * IsExistMiddleE

4、lement* 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)*keyIndex = i;return

5、 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 的线性扫描就足以找出所有这些排好序的子数组段。然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段3

6、,4,7,8, 1, 2,5,6.继续合并相邻排好序的子数组段,直至整个数组已经排好序。算法设计及代码实现:(1). 数组实现法:#define DEBUG 1typedef 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; /*第一个排好序的结束位置*/begin2 = betwe

7、en + 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 = k;#if DEBUGprintf(“n 数组分割点为:n“)

8、;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 LINKtypedef struct node *link_t;struct node int item;link_t next;l

9、ink_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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报