離散システム特論 整列(sorting)アルゴリズム 2 参考文献 1. 大森克史・木村春彦・広瀬貞樹 著 「アルゴリズム の基礎」 共立出版(1997) 2. 渡邊敏正 著 「データ構造と基本アルゴリズム」 共立出版(2000) 整列とは 全順序集合Sが与えられたとき,Sのすべて の要素をその全順序に従って並べ替えるこ と. 簡単のため,n個の整数の集合をSとし,通 常の数字の大小関係で小さい数から大きい 数へ並べ替えるとする(昇順ソート ascending sort). ソーティングアルゴリズム 選択法 (selection sort) バブルソート (bubble sort) 挿入法 (insertion sort) クイックソート (quick sort) ヒープソート (heap sort) マージソート (merge sort) バケットソート (bucket sort) 基数ソート(radix sort) O(n2) O(n log n) ソーティングアル ゴリズムの限界 マージソート (merge sort) 入力を2つに分割して,分割した各々を整列した後に, それらを統合する.分割した部分の整列にも再びマー ジソートを用いる.つまり,再帰的にソートが行われる. divide-and -conquer method マージソートの擬似コード s=1, t=n; mergesort(s, t){ // sからtの要素をソート if (s ≠ t){ A1 = mergesort(s, (s+t)/2); //sから半分までをソートしてA1にしまう A2 = mergesort( (s+t)/2+1, t); //半分からtまでをソートしてA2にしまう. merge (A1, A2); //A1とA2をあわせる } } マージソートの例 (4,10,5,2,1,7,9,3,8,6) 分割 (4,10,5,2,1)(7,9,3,8,6) 分割 ((4,10,5)(2,1))((7,9,3)(8,6)) 分割 (((4,10)(5))((2)(1)))(((7,9)(3))((8)(6))) 分割((((4)(10))(5))((2)(1)))((((7)(9))(3))((8)(6))) 統治(((4,10)(5))((2)(1)))(((7,9)(3))((8)(6))) 統治((4,5,10)(1,2))((3,7,9)(6,8)) 統治(1,2,4,5,10)(3,6,7,8,9) マージソートの例(統治) (1,2,4,5,10) 1 2 3 4 (3,6,7,8,9) 5 6 7 8 9 10 マージソートの計算量 T(n):マージソートの計算量 T(n) 統治 2T(n/2)+n (n2) 1 (n=1) より T(n) 2T(n/2)+n 2{2T(n/22)+n/2}+n = 22T(n/22) + 2n 22 {2T(n/23)+n/22} +2n = 23T(n/23) + 3n … 2kT(n/2k) + kn (k = log n) よって,T(n) = n+n log n =O(n log n) ソーティングアルゴリズムの下限 2つの要素の大小比較が基本操作のアルゴリズム → アルゴリズムの判断の分岐数は2 計算のいかなる進行もまとめて,決定木(decision tree)で 表せる. 各頂点は,それまでの計算によって獲得された状態. 2要素の比較がその状態から出る2本の枝 葉がソートされた状態 決定木 その時点で 考え得る状 態 {a, b, c}のソート abc, acb, bac, bca, cab, cba 2要素の比較はどれ でもよい.名付けをか えればよいので. a<b no yes bac abc bca acb cba cab yes yes no no a<c a<c bca bac abc cab cba acb yes b<c no yes b<c no bca cba abc acb ソートさ れた状態 決定木の深さの下限 葉はすべてのソートされた状態に対応 ...総数は n! 最悪の場合(運の悪い問題例)では,決定木の深さ分の比 較が必要. abc, acb, bac, bca, cab, cba 葉の数がn!の決定木(2分木)の 深さは最低でもどのくらいか? yes yes abc acb cab a<c no cab abc acb yes b<c no abc acb a<b no bac bca cba yes a<c bac no bca cba yes b<c no bca cba 決定木の深さの下限(2) • 深さdの2分木の葉の数は,高々2d • 2d n! を満たす最小のdをみつければよい. Stirlingの公式: N! ≒ √2πn nn e-n より,d ≒n log n ソーティングアルゴリズムはO(nlog n)より早くならない. (ヒープソートは最適.) 一般的にアルゴリズムの下限を示すのは大変. バケットソート,基数ソートは比較以上の情報がある. クイックソート(quick sort) 1つの要素aを基準とし,aよりも小さい要素をaの左に aよりも大きい要素をaの右に分割する.分割した部分 の整列も再帰的にソートを行う. マージソートと同じで分割統治法.ただし, ◆分割は等分ではない ◆統治の操作は必要ない 基準値による分割の擬似コード a1からan-1をanを基準値にして分割.a0は十分小さな値が入っていると仮定 left :=1, right:=n-1; while(left<right) { while (aright > an){ right:=right-1; } while (aleft < an){ left:=left+1; } swap (aleft, aright); } swap (aleft, an); クイックソートの例(1) (4,10,5,2,1,7,9,3,8,6) right left 基準値 (4,10,5,2,1,7,9,3,8,6) right left 基準値 (4,10,5,2,1,7,9,3,8,6) left right 基準値 (4,3,5,2,1,7,9,10,8,6) left right 基準値 クイックソートの例(2) (4,3,5,2,1,7,9,10,8,6) 基準値 right left (4,3,5,2,1,6,9,10,8,7) (4, 3, 5, 2, 1) (9, 10, 8, 7) あとはよろしく クイックソートの計算量 基準値をソートする部分の最小値が常に選ばれてし まうと,選択法と変わらない. ↓ 最悪時間計算量はO(n2) 平均時間計算量はO(n log n) クイックソートの平均時間計算量 T(n):n個のデータをクイックソートする平均時間 T(n) = T(m1)+T(m2)+n-1, ただし,m1+m2=n-1 (m1, m2):(0, n-1), (1, n-2), …, (n-1, 0) が等確率におこるとすると, 1 n1 T(n) T(i) T(n 1 i) n 1 n i 0 クイックソートの平均計算量(2) n1 1 T(n) T(i) T(n 1 i) n 1 n i 0 s(n) S(n 1) 2 n 1 n n 1 S(n 2) 2 2 n 1 n n 1 S(1) 2 2 ...... 2 3 n 1 1 1 1 2(1 2) 2 3 n 1 2 n1 T(i) n 1 n i 0 n1 n(T(n) 2) n(n 1) 2 (T(i) 2) i 0 S(n)=T(n)-2とおくと, nS(n) = n(n+1)+2(S(0)+S(1)+…+S(n-1)) ( S(1) T(1) 2 2) (n-1)S(n-1) = (n-1)n +2(S(0)+S(1)+…+S(n-2)) 引き算すると, nS(n) = (n+1)S(n-1)+2n よって, S(n) 2(n+1)Hn+1 =O(nlog n) レポート課題 ① ② ③ 講義で取り上げなかったソーティングアルゴリズムについて調べ,計 算量の算定もせよ. 講義で扱ったソーティングアルゴリズムを3つ選び,それを自分でプ ログラムし,様々な入力に対する実行時間の比較をせよ. 2004年2月期大学院入試問題計算機科学II(整列の問題)を解け. http://www.sk.tsukuba.ac.jp/SSE/admission/p astexams.htmlより入手
© Copyright 2025 ExpyDoc