算法设计与分析课后习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章
1. 算法分析题
算法分析题1-1 求下列函数的渐进表达式
(1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2)
(2). n^2 / 10 + 2^n
当n>5是,n^2 < 2 ^n
所以,当n >= 1时,n^2/10 < 2 ^n
故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n)
(3). 21 + 1/n < 21 + 1 = 22 = O(1)
(4). log(n^3)=3log(n)=O(log(n))
(5). 10log(3^n) = (10log3)n = O(n)
算法分析题1-6
(1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5
所以:f(n)=Θ(log(n)+5) =Θ(g(n))
(2)因为:log(n) < √n; f(n) = 2log(n); g(n)= √n
所以:f(n) = O(g(n))
(3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 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)=log^2(n); g(n) = log(n)
所以: f(n) ==Ω(g(n))
(7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2
所以: f(n) = Ω(g(n))
(8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n
所以: f(n) = O(g(n))
习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)).
分析与解答:
因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)).
第二章
算法分析题
2-3 设a[0:n-1]是已经排好序的数组。请改写二分搜索算法,似的当搜索元素x 在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x的位置。
分许与解答:
改写二分搜索算法如下:
typedef int TYPE_t;
/*
* Function name: BinarySearch
* 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 right = nLen - 1;
int middle = (left + right) / 2;
while (left <= right){
if (xVar == aArr[middle]){
*iIndex = *jIndex = middle;
return 1;
}
if (xVar > aArr[middle]){
left = middle + 1;
}else{
right = middle - 1;
}
middle = (left + right) / 2;
}
*iIndex = right;
*jIndex = left;
return 0;
}
算法分析题2 – 6 对任何非零偶数n,总可以找到奇数m和正整数k,使得n = m * 2^k.为了求出2个n阶矩阵的乘积,可以把一个n阶矩阵划分成m×m个子矩阵,每个子矩阵2^k×2^k个元素。当需要求2^k×2^k的子矩阵的积时,使用Strassen算法。设计一个传统方法与Strasssen算法相结合的矩阵相乘算法,对于任何偶数n,都可以求出2个n 阶矩阵的乘积。并分析算法的计算时间复杂度。
分析与解答:
将n阶矩阵分块为m×m的矩阵。用传统方法求2个m阶矩阵的乘积需要计算O(m^3)次2个2^k×2^k矩阵的乘积。用Strassen矩阵乘法计算2个2^k×2^k的矩阵的乘积需要的计算时间为O(7^k), 因此算法的计算时间为O(7^k*m^3).
算法分析题2 - 9 设T[0, n-1]是n个元素的数组。对任一元素x,设S(x) = {i | T[i] = x }. 当|S(x) | > n/2时,称x为T的主元素。设计一个线性时间算法,确定T[0:n-1]是否有一个主元素。
分析与解答:
如果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[]: 表示数组T[0:n-1]