第
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