第
1
章
概论
1
5.
设有
n
个互不相同的整数,按递增顺序存放在数组
a
[0..
n
-
1]
中,若存在一个下标
i
(
0
≤
i
<
n
),使得
a
[
i
]=
i
。设计一个算法以
O(log
2
n
)
时间找到这个下标
i
。
1
6.
请你模仿二分查找过程设计一个三分查找算法。分析其时间复杂度。
1
7.
对于大于
1
的正整数
n
,能够分解为
n
=
x
1
*
x
2
*
…
*
x
m
,其中
x
i
≥
2
。例如,
n
=12
时
有
8
种不一样的分解式:
12=12
,
12=6*2
,
12=4*3
,
12=3*4
,
12=3*2*2
,
12=2*6
,
2=2*3*2
,
12=2*2*3
,设计一个算法求
n
的不一样分解式个数。
8.
设计一个基于
BSP
模型的并行算法,假设有
p
台处理器,计算整数数组
a
[0..
n
-
1]
的全部元素之和。并分析算法的时间复杂度。
1
1
1.3.2
练习题参考答案
1
2
3
.
答:
C
。
.
答:
D
。
.
答:
以
a
[]={1
,
2
,
3
,
4
,
5}
为例说明。选项
A
中在查找
5
时出现死循环。选项
B
中在查找
5
时返回
-
1
。选项
C
中在查找
5
时返回
-
1
。选项
D
正确。
4.
答:
对于无序序列
a
[low..high]
进行快速排序,整个排序为“大问题”。选择其中的
一个基准
base=
a
[
i
]
(一般以序列中第一个元素为基准),将全部小于等于
base
的元素移动
到它的前面,全部大于等于
base
的元素移动到它的后面,即将基准归位到
a
[
i
]
,这样产生
a
[low..
i
-
1]
和
a
[
i
+1..high]
两个无序序列,它们的排序为“小问题”。当
a
[low..high]
序列只
有一个元素或者为空时对应递归出口。
因此快速排序算法就是采用分治策略,将一个“大问题”分解为两个“小问题”来求
解。因为元素都是在
a
数组中,其合并过程是天然产生的,不须要特别设计。
5
.
答:
此时快速排序对应的递归树高度为
O(
n
)
,每一次划分对应的时间为
O(
n
)
,所
以整个排序时间为
O(
n
2
)
。
6
7
.
答:
其中二路归并排序和折半查找算法采用分治策略。
.
答:
适合并行计算的问题一般表现出如下特征:
(
1
)将工做分离成离散部分,有助于同时解决。例如,对于分治法设计的串行算
法,能够将各个独立的子问题并行求解,最后合并成整个问题的解,从而转化为并行算
法。
(
(
2
)随时并及时地执行多个程序指令。
3
)多计算资源下解决问题的耗时要少于单个计算资源下的耗时。
8
.
答:
xy
=(
ac
-
bd
)+((
a
+
b
)(
c
+
d
)
-
ac
-
bd
)
i
。因而可知,这样计算
xy
只须要
3
次乘法(即
ac
、
bd
和
(
a
+
b
)(
c
+
d
)
乘法运算)。
答:
采用基本的二路归并思路,先求出
a
、
b
的交集
ab
,再求出
c
、
d
的交集
cd
,
最后求出
ab
和
cd
的交集,即为最后的结果。也能够直接采用
4
路归并方法求解。
0.
解:
采用相似求求一个整数序列中的最大次大元素的分治法思路。对应的程序如
9
.
1
下:
#
#
#
include <stdio.h>
define max(x,y) ((x)>(y)?(x):(y))
define min(x,y) ((x)<(y)?(x):(y))
2
3