算法设计与分析基础(十一)

算法设计与分析基础(十一)

练习题

习题一

假定集合{9, 8, 5, 7, 6, 10}的元素依次存放在数组A[1…6]中,试用图示给出线性建堆的执行过程,其中堆中任一结点均小于其子节点。

解答:最小堆构建图示

image-20211214173639562

习题二

利用堆排序的算法思想,设计一个算法从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.分析如下

image-20211214174359805

解法二

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.分析

image-20211214175004514

习题三

a. 应用霍纳法则计算下列多项式:

p(x) = 3x4 - x3 + 2x +5 , x = -2

b. 利用霍纳法则的运算结果,求p(x)除以 x+2之后的商和余数。

image-20211214175134263

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值