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

上传人:秋*** 文档编号:271280534 上传时间:2022-03-28 格式:DOC 页数:8 大小:44KB
返回 下载 相关 举报
算法设计与分析课后习习题_第1页
第1页 / 共8页
算法设计与分析课后习习题_第2页
第2页 / 共8页
算法设计与分析课后习习题_第3页
第3页 / 共8页
算法设计与分析课后习习题_第4页
第4页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、第一章1. 算法分析题算法分析题11 求下列函数的渐进表达式(1). 3n2 + 10n 5是,n2 = 1时,n2/10 2 n故: n2/10 + 2n 2 n + 2n = 2*2n = O(2n)(3). 21 + 1/n 21 + 1 = 22 = O(1)(4). log(n3)=3log(n)=O(log(n)(5). 10log(3n) = (10log3)n = O(n)算法分析题1-6(1) 因为:f(n)=log(n2) = 2log(n); g(n) = log(n) + 5所以:f(n)=(log(n)+5) =(g(n)(2) 因为:log(n) n ; f(n)

2、= 2log(n); g(n)= n 所以:f(n) = O(g(n)(3) 因为:log(n) n; f(n) = n; g(n) = log(n2) = 2log(n)所以;f(n) = (g(n)(4) 因为:f(n) = nlogn +n; g(n) = logn所以:f(n) =(g(n)(5) 因为: f(n) = 10; g(n) = log(10)所以:f(n) =(g(n)(6) 因为: f(n)=log2(n); g(n) = log(n)所以: f(n) =(g(n)(7) 因为: f(n) = 2n n 2所以: f(n) = (g(n)(8) 因为:f(n) = 2n

3、; g(n) = 3 n; 2 n 3 n所以: f(n) = O(g(n)习题19 证明:如果一个算法在平均情况下的计算时间复杂性为(f(n),该算法在最坏情况下所需的计算时间为(f(n).分析与解答:因此,Tmax(N) = (Tavg(N) = (f(n)=(f(n).第二章算法分析题2-3 设a0:n-1是已经排好序的数组。请改写二分搜索算法,似的当搜索元素x在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x的位置。分许与解答:改写二分搜索算法如下:typedef int TYPE_t;/* * Function name: Bin

4、arySearch * Parameters: * iIndex 代表i的位置,即最大元素位置; * jIndex代表j的位置,即最小元素位置; * aArr: 代表数组a,且有序 * xVar:代表元素x; * aLen: 代表数组元素个数; * Return value: * 0: 执行成功,最大元素位置和最小元素位置不等 * 1: 执行成功,最大元素位置和最小元素位置相等 */static int BinarySearch(TYPE_t aArr, int nLen, TYPE_t xVar, int *iIndex, int *jIndex) int left = 0; int rig

5、ht = nLen - 1; int middle = (left + right) / 2; while (left aArrmiddle) left = middle + 1; else right = middle - 1; middle = (left + right) / 2; *iIndex = right; *jIndex = left; return 0;算法分析题2 6 对任何非零偶数n,总可以找到奇数m和正整数k,使得n = m * 2k.为了求出2个n阶矩阵的乘积,可以把一个n阶矩阵划分成mm个子矩阵,每个子矩阵2k2k个元素。当需要求2k2k的子矩阵的积时,使用Stra

6、ssen算法。设计一个传统方法与Strasssen算法相结合的矩阵相乘算法,对于任何偶数n,都可以求出2个n阶矩阵的乘积。并分析算法的计算时间复杂度。分析与解答:将n阶矩阵分块为mm的矩阵。用传统方法求2个m阶矩阵的乘积需要计算O(m3)次2个2k2k矩阵的乘积。用Strassen矩阵乘法计算2个2k2k的矩阵的乘积需要的计算时间为O(7k), 因此算法的计算时间为O(7k*m3).算法分析题2 - 9 设T0, n-1是n个元素的数组。对任一元素x,设S(x) = i | Ti = x . 当|S(x) | n/2时,称x为T的主元素。设计一个线性时间算法,确定T0:n-1是否有一个主元素。

7、 分析与解答:如果T有一个主元素x,则x是T的中位数。反之,如果T的中位数不是T的主元素,则T没有主元素。下面算法设计为在一个线性时间中找中位数:typedef int T;#define YES_MIDDLE_ELEMENT 1#define NO_MIDDLE_ELEMENT 0/* * Function name: * IsExistMiddleElement * Parameters: * aArr: 表示数组T0:n-1 * n: 表示数组长度 * x: 表示要判断的数x,是否主元素 * *keyIndex: 表示主元素在数组中的下标 * * Return: * YES_MIDDLE

8、_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 YES_MIDDLE_ELEMENT; *keyIndex = -1; return NO_MIDDLE_ELEMENT;算法分析题2-14 对所给元素存储于数组中和存储于链表中2中情形,写出自然合并排序算法。分析

9、与解答:自然合并排序是合并排序算法的一种改进。自然合并排序,对于初始给定的数组,通常存在多个长度大于1的已自然排好序的子数组段。例如,若数组a中元素为4,8,7,1,5,6,2,则自然排好序的子数组段有4,8, 3, 7, 1,5,6, 2.用一次对数组a的线性扫描就足以找出所有这些排好序的子数组段。然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段3,4,7,8, 1, 2,5,6.继续合并相邻排好序的子数组段,直至整个数组已经排好序。算法设计及代码实现:(1). 数组实现法:#define DEBUG 1typedef int type_t;static void Datas

10、etMerge(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 = between + 1; /*第二个排好序的初始位置*/ end2 = right; /*第二个排好序的结束位置*/ tmpArr = malloc(sizeof(type_t) * (right - left + 1); if

11、(!tmpArr) return; k = 0; /* * 比较两个指针指向的元素,选择相对小的元素放入合并空间 * 并移动指针到下一个位置 */ while (begin1 = end1) & (begin2 = end2) if (arrbegin1 arrbegin2) tmpArrk = arrbegin1; begin1+; else tmpArrk = arrbegin2; begin2+; k+; /* 如果第一个序列有剩余,直接拷贝到合并数组的序列中 */ while (begin1 = end1) tmpArrk+ = arrbegin1+; /* *如果第二个序列有剩余,直

12、接拷贝到合并数组的序列中 */ while(begin2 = end2) tmpArrk+ = arrbegin2+; /* *拷贝临时数组序列到原数组中 */ for (i = 0; i = (right - left); i+) arrleft + i = tmpArri; free(tmpArr); void DatasetNatureMerge(type_t arr, int n) int *tmpArr; int i, k = 0; int s = 1; int group; /*记录分割组的数目*/ int count = 0; int left, between, right; int arrLen = n; /*

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

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