算法设计与分析基础(十一)
练习题
习题一
假定集合{9, 8, 5, 7, 6, 10}的元素依次存放在数组A[1…6]中,试用图示给出线性建堆的执行过程,其中堆中任一结点均小于其子节点。
解答:最小堆构建图示
习题二
利用堆排序的算法思想,设计一个算法从n个元素的集合中选出第k个最小元素。
a) 给出算法思想的自然语言描述;
b) 已知线性建堆过程与堆顶元素的删除过程,给出算法的形式化描述;
c) 分析算法的计算复杂度,并找出算法复杂度为线性时变量k应满足的条件。
解法一
a. 1)利用堆排序的思想,先将n个元素构建成小顶堆,此时整个序列的最小元素就是堆顶元素;
2)删除堆顶元素,并将剩余n-1个元素重新构造成小顶堆;
3)重复第2步k-1次,此时的堆顶元素即为第k个最小元素。
b.伪代码描述
Algorithm FindKthNum(A[1..n-1])
//输入:n个元素的数组A
//输出:第k个最小元素
Begin
BuildMinHeap(A) //对数组A中的n个元素建立小顶堆
for i :=1 to k-1 do:
Delete(A, 0); //删除堆顶元素
DownAdjust(A, 0); //从堆顶元素开始向下调整堆
return A[0];
end
c.分析如下
解法二
a.算法基本思想:我们可以利用大顶堆的特性,维护一个含k个元素的大顶堆,堆中的k个节点代表当前最小的k个元素,而堆顶显然是当前k个元素中的最大值。本题算法具体步骤如下:
1)从n个元素的集合中任意取出k个元素建立大顶堆;
2)将堆顶元素和剩余n-k个比较,如果比堆顶元素小则交换当前堆顶元素,调整堆;
3)直到剩余的n-k个元素比较完,则堆顶元素就是第k个最小元素;
b.伪代码
Algorithm FindKthNum(A[1..n-1])
//输入:n个元素的数组A
//输出:第k个最小元素
Begin
B := A[n-k+1..n-1]; //选取数组A的最后k个元素建立大顶堆
BuildMaxHeap(B);
for i ≤ n-k do:
if A[i] ≤ B[0] then B[0] = A[i];
DownAdjust(B, 0)//从堆顶元素开始向下调整堆
return B[0];
end
c.分析
习题三
a. 应用霍纳法则计算下列多项式:
p(x) = 3x4 - x3 + 2x +5 , x = -2
b. 利用霍纳法则的运算结果,求p(x)除以 x+2之后的商和余数。