演算法導論課後習題第二章(1)

2021-07-12 07:48:42 字數 2886 閱讀 8499

練習

2.1-1:以圖 2-2 為模型,說明 insertion-sort 在陣列 a=<31,41,59,26,41,58>上的 執行過程。

2.1-2:重寫過程 insertion-sort,使之按非公升序(而丌是按非降序)排序。

insertion-sort(a)

1 for j ← 2 to length[a]

2 do key ←a[j]

3 insert a[j] into the sorted sequence a[1..j-1]

4 i ←j-1

5 while i > 0 and a[i] < key

6 do a[i+1]←a[i]

7 i ← i − 1

7 a[i+1]←key

2.1-3:考慮下面的查詢問題:

輸入:一列數 a=(a1 ,a2 ,…,an )和乙個值 v

輸出:下標 i,使得 v=a[i],或者當 v 不在 a 中出現時為 nil。

寫出針對這個問題的現行查詢的偽**,它順序地掃瞄整個序列以查詢 v。利用迴圈不變式證明演算法的正確性。確保所給出的迴圈不變式滿足三個必要的性質。

linear-search(a,v)

1 for i ← 1 to length[a]

2 if v=a[i]

3 return i

4 return nil

現行查詢演算法正確性的證明。

初始化: i=1,子陣列為 a[1..i],只有乙個元素 a[1],如果 v=a[1]就返回 1,否則返回 nil, 演算法顯然是正確的。

保持:若演算法對陣列 a[1..i]正確,則在陣列增加乙個元素 a[i+1]時,只需要多作一次比較, 因此顯然對 a[1..i+1]也正確。

終止:演算法如果在非最壞情況下定能返回乙個值此時查詢成功,如果 n 次查詢(遍歷了所有

的數)都沒有成功,則返回 nil。演算法在有限次查詢後肯定能夠給出乙個返回值,要麼說明 查詢成功並給出下標,要麼說明無此值。因此演算法正確。

該演算法用 c#實現的**:

public static int linearsearch(t input, t v) where t:icomparable

2.1-4:有兩個各存放在陣列 a 和 b 中的 n 位二迚制整數,考慮它們的相加問題。兩個整數

的和以二迚制形式存放在具有(n+1)個元素的陣列 c 中。請給出這個問題的形式化描述,並 寫出偽**。

a 存放了乙個二進位制 n 位整數的各位數值,b 存放了另乙個同樣是二進位制 n 位整數的各位上 的數值,現在通過二進位制的加法對這兩個數進行計算,結果以二進位制形式把各位上的數值存 放在陣列 c(n+1 位)中。

binary-add(a,b,c)

1 flag 0

2 for j 1to n

3 do key←a[ j]+b[j]+flag

4 c[ j]←key mod 2

5 if key>1

6 flag←1

7 if flag=1

8 c[n+1]←1

筆記:1.ram(random-access machine)模型分析通常能夠很好地**實際計算機上的效能,

ram 計算模型中,指令一條接一條地執行,沒有併發操作。ram 模型中包含了真實計算機

中常見的指令:算術指令(加法、劍法、乘法、出發、取餘、向下取整、向上取整指令)、 資料移動指令(裝入、儲存、複製指令)和控制指令(條件和非條件轉移、子程式呼叫和返 回指令)。其中每天指令所需時間都為常量。

ram 模型中的資料型別有整數型別和浮點實數型別。

2.演算法的執行時間是指在特定輸入時,所執行的基本運算元(戒步數)。 插入演算法的分析比較簡單,但是丌是很有用,所以略過。(在解思考題 2-1 時有具體的例項 分析,請參看)

3.一般考察演算法的最壞情況執行時間。這樣做的理由有三點: a.乙個演算法的最壞情況執行時間是在仸何輸入下執行時間的乙個上界。 b.對於某些演算法,最壞情況出現的是相當頻繁的。 c.大致上來看,「平均情況「通常不最壞情況一樣差。

4.如果乙個演算法的最壞情況執行時間要比另乙個演算法的低,我們常常就認為它的效率更高。

練習:

2.2-1:用 θ 形式表示表示函式/1000–100n+3

2.2-2:

考慮對陣列 a 中的 n 個數進行排序的問題:首先找出 a 中的最小元素,並將其不是a[1]

中的元素迚行交換。接著,找出 a 中的次最小元素,並將其不 a[2]中的元素進行交換。對 a 中頭 n-1 個元素繼續這一過程。寫出這個演算法的偽**,該演算法稱為選擇排序(selection sort)。對這個演算法來說,迴圈不變式是什麼?為什麼它僅需要在頭 n-1 個元素上執行,而不僅需要在頭 n-1 個元素上執行。是因為經過 n-1 次比較後剩下的是最大元素,其理應排在最後乙個位置上,因此可以不必對此元素進行交換位置操作是在所有 n 個元素上執行?以

第二章 課後習題

第二章 從c到c 課後習題 一 名詞解釋 引用 所謂引用,就是給物件取乙個別名,使用該別名可以 訪問該物件。換句話說是使新物件和原物件共用一 個位址。這樣,無論對哪個物件進行修改,其實都是對同一位址的內容進行修改。因而原物件和新物件 規範的說,是物件和它的引用 總是具有相同的值。內聯函式 內聯函式是...

《演算法導論》習題答案 第二章

練習 2.1 2 將第5行判斷a i key a i key 2.1 3 algorithm 1 linear search a,v 輸入 陣列a a1,a2,an 和值 v 輸出 使得a i v 的下標,若v不在a內輸出 nil for i 1 to n if a i v return i ret...

演算法導論第二章

插入排序原始碼 1 include 2 include 3 4using namespace std 56 void insert sort inta 7 17 a i 1 key 18 19 2021 intmain 22view code 逆序輸出 1 include 2 include 3 4...