1/28
ドラクエ6もう発売してたのか・・・
ゲノム Chapter 1
ゲノム・トランスクリプトーム・プロテオーム
An Introduction to Algorithms / アルゴリズムイントロダクション Chapter 2
ソートアルゴリズム、計算量イントロダクション
教科書の配列のインデクスが1から始まることに気づいていなかったので、練習問題はインデクスが0からの配列を仮定して擬似コードや証明を書いてしまった
Exercise 2.1-1
(31 41 59 26 41 58) ... (26 31 41 59 41 58) (26 31 41 41 59 58) (26 31 41 41 58 59)
Exercise 2.1-2
不等号を逆にする
Exercise 2.1-3
def LinearSearch (A v) loop for i from 0 below A.length if A[i] == v return i return nil
loop中A[0 .. i-1]にはvがない事を示せばよい
Exercise 2.1-4
def Add (A B) C <- MakeArray( A.length + 1 ) carry <- 0 loop for i from A.length - 1 to 0 C[i+1] <- ( carry + A[i] + B[i] ) % 2 carry <- ( carry + A[i] + B[i] ) / 2 C[0] <- carry return C
Exercise 2.2-1
Exercise 2.2-2
def SelectionSort ( A ) loop for i from 0 below A.length - 1 min <- i loop for j from i below A.length if A[j] < A[min] min <- j swap( A i min )
iについてのloopは、A[0 .. i-1]が、「sort済み」 & 「A[i ..]のどの要素より小さい要素からなる」 という性質を保つ
A.length-1までループすれば、A[0 .. A.length - 2]はA[A.length - 1]より小さい要素からなるのでAはソート済みとなる
Best | Worst |
---|---|
Exercise 2.2-3
Average | Worst |
---|---|
Exercise 2.2-4
ランダムな選び方をする。
ソートならボゴソート
探索なら当てずっぽ探索
Exercise 2.3-1
<3,41,52,26,38,57,9,49> <3,41,52,26> <38,57,9,49> <3,41> <52,26> <38,57> <9,49> <3> <41> <52> <26> <38> <57> <9> <49> <3,41> <26,52> <38,57> <9,49> <3,26,41,52> <9,38,49,57> <3,9,26,38,41,49,52,57>
Exercise 2.3-2
問題文の通りにやる
Exercise 2.3-3
をkに関する帰納法で示す
示した。
Exercise 2.3-4
Exercise 2.3-4
def BinarySearch (A v) def BinarySearchSub (min max) pivot <- ( min + max ) / 2 if A[pivot] == v return pivot else if min >= max return nil else if A[pivot] < v return BinarySearchSub( pivot + 1, max ) else if A[pivot] > v return BinarySearchSub( min, pivot + 1 ) return BinarySearchSub( 0, A.length - 1 )
Exercise 2.3-6
できない なぜならばインサートしたあと右側の配列を一つずらしてコピーする必要があり、それにO(n)だけかかるから
Exercise 2.3-7
loop for i from 0 below A.length if BinarySearch( A[i+1 ... A.length], x - A[i] ) return true return false
Problems 2-1
- a 最悪k^2の計算をn/k回するので、計算量は
- b 配列の長さを毎回kと比較し、kより短い場合はInsertionSortをし、kより長い場合はMergeSortをする
- c
- d 定数項を吟味して決める。
Problems 2-2
- a 元の配列と要素が同じことを証明する
- b A[j]はA[j ..]の最小値である。証明略
- c A[1..i-1]はソート済みである。証明略
- d
Problems 2-3
- a
- b 毎回を計算するとになる
- c
- d cより明らか
Problems 2-4
- a (2,1) (3,1) (8,6) (8,1) (6,1)
- b 逆にソートされた配列
- c 配列をずらす長さの合計はinversionの数と等しくなるので、inversionの回数をmとおくと計算量はとなる。
- d 二つのリストをMergeするとき、右のリストから数を取るたびに左側のリストの長さを足してゆく。