100 likes | 214 Vues
アルゴリズムとデータ構造. 第6回整列のアルゴリズム(2). 整列アルゴリズムの種類と時間計算量. 最悪時間計算量の 漸近的上界. 注 ) バケット数と桁数を定数とみた場合. 5. 0. 3. 2. 5. 8. 5. 7. 1. 6. 5. 0. 3. 2. 5. 8. 5. 7. 1. 6. 1. 5. 1. 0. 3. 2. 5. 6. 5. 7. 5. 8. 5. 0. 1. 3. 2. 5. 5. 6. 5. 7. 5. 8. 1. 0. 3. 2. 5. 8. 5.
E N D
アルゴリズムとデータ構造 第6回整列のアルゴリズム(2) アルゴリズムとデータ構造 2013
整列アルゴリズムの種類と時間計算量 最悪時間計算量の 漸近的上界 注)バケット数と桁数を定数とみた場合 アルゴリズムとデータ構造 2013
5 0 3 2 5 8 5 7 1 6 5 0 3 2 5 8 5 7 1 6 1 5 1 0 3 2 5 6 5 7 5 8 5 0 1 3 2 5 5 6 5 7 5 8 1 0 3 2 5 8 5 7 5 6 0 1 3 2 5 6 5 7 5 8 1 0 3 2 5 6 5 7 5 8 1 0 3 2 5 6 5 7 5 8 0 1 2 3 5 6 5 7 5 8 0 0 6 8 0 8 0 1 2 3 5 6 5 7 5 8 0 1 2 3 5 6 5 7 5 8 0 1 2 3 5 5 6 7 5 8 0 1 2 3 5 5 6 7 5 8 0 1 2 3 5 5 5 6 7 8 [考え方]等間隔の部分列に挿入ソートを適用し、間隔を 小さくして繰り返し行うことでソートする。 シェルソート :挿入要素 :挿入位置 [アルゴリズム] h1(=1),h2,…:自然数の数列(増分列 increment sequence) Step 1 i←arg max hj Step 2 j=0,1,…,hi-1に対する各部分列 A[j+hi],A[j+2hi],…を挿入ソートでソートする。 Step 3 i=1なら停止。 そうでないならi←i-1としてStep 2へ。 hi+1=3hi+1,h1=1 j:hj<n 増分列の選び方により時間計算量が変わってくる。 最悪時間計算量 O(n(logn)2) :増分列が 1,2,3,4,6,9,8,12,18,27,16,24,36,54,81,….のとき 但し n: 要素数 ×2 ×3 アルゴリズムとデータ構造 2013
5 0 3 2 5 8 5 7 1 6 5 5 0 0 3 3 2 2 5 5 8 5 7 1 6 2 3 5 5 0 2 3 5 2 5 6 7 5 0 8 3 5 0 0 5 5 2 5 0 5 2 3 5 3 2 5 0 2 3 5 5 0 2 3 5 5 1 8 1 5 5 7 6 7 1 8 6 [考え方]2等分に分けてそれぞれをソートしてから マージする。 マージソート マージとは ソート済みの2つのリストを合成して 1つのソートされたリスト作成する処理 [アルゴリズム] msort(p,n,A): A[p],A[p+1],…,A[p+n-1]を整列 Step 1 n=1なら何もしないでリターン Step 2 h← n/2 Step 3 msort(p,h,A)とmsort(p+h,n-h,A) を実行 Step 4 2つのソート済みの配列 A[p],A[p+1],…,A[p+h-1]と A[p+h],A[p+h+1],…,A[p+n-1]をマージして A[p],A[p+1],…,A[p+n-1]に格納 ソート済みの2つの配列A[0],A[1],…,A[n-1]と B[0],B[1],…,B[m-1]をマージしてソート済みの 配列C[0],C[1],…,C[n+m-1]を作成する アルゴリズム(A[n]=B[m]=∞と仮定) Step 1 i,,j,k←0 Step 2 A[i]≦B[j]であれば、C[k]←A[i], i←i+1 そうでなければC[k]←B[j], j←j+1 Step 3 i=nかつj=mならば停止。 そうでなければk←k+1としてStep 2へ ←番兵! アルゴリズムとデータ構造 2013
マージソートの最悪時間計算量 マージソートの最悪時間計算量は O(n log n) (証明) T(n)をn個の要素をマージソートするときの時間計算量とする。 まず、n=2kのとき、成り立つことを示す。このとき適当な定数cを用いて、 T(n)≦2T(n/2)+cn とかける。よって T(n)≦2(2T(n/22)+c(n/2))+cn ≦22T(n/22)+2cn ・・・ ≦2kT(1)+kcn=nT(1)+cn log n したがってT(n)=O(n log n)である。 n≠2kのとき、2k-1≦n≦2kを満たすkが存在する。このときn’=2kとすれば、msortの深さiの再帰呼出しに渡る要素数はn’/2iを超えない。つまり、n個の要素に対してmsortを実行する場合は、どの再帰呼出しにおいてもn’個の要素に対してmsortを実行する場合より要素数は多くならない。よって、 T(n)≦T(n’)=O(n’ log n’)=O(2n log 2n)=O(n log n) が成り立つ。 アルゴリズムとデータ構造 2013
5 0 3 2 5 8 5 7 1 6 8 5 3 3 3 7 5 5 5 2 2 6 2 6 temp=8 temp=6 temp=5 temp=5 temp=3 5 5 5 1 1 1 5 0 0 6 temp=8 temp=5 temp=6 temp=5 temp=3 temp=7 temp=3 temp=6 temp=2 temp=5 temp=5 temp=5 7 7 temp=2 temp=1 temp=2 temp=5 temp=1 temp=1 temp=7 temp=8 temp=7 7 5 2 2 2 2 5 1 1 1 6 2 2 2 0 5 0 5 0 5 5 5 5 1 1 5 5 1 2 2 2 3 3 3 0 0 0 2 5 5 5 6 5 6 5 8 7 5 2 6 3 5 0 1 5 5 3 3 3 2 2 2 2 5 1 1 1 0 0 0 0 1 5 1 5 3 5 5 5 5 5 5 5 0 6 6 6 7 7 7 7 8 8 8 8 2 3 5 0 0 0 0 3 5 7 5 5 5 2 6 6 2 2 6 2 2 2 0 5 0 0 5 5 5 5 5 5 1 1 5 1 2 0 0 0 2 2 3 3 0 5 1 1 1 5 1 5 5 1 3 3 3 3 3 5 3 5 5 5 5 5 5 5 5 5 5 5 0 6 6 6 0 6 6 0 6 1 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 6 1 5 5 5 2 2 2 3 3 3 0 0 0 1 1 1 5 5 3 5 5 5 6 6 6 7 7 7 8 8 8 2 0 0 0 2 2 3 3 3 3 3 3 5 5 5 5 5 1 1 1 5 0 0 0 0 0 6 2 0 1 2 1 2 5 5 2 2 3 3 3 5 0 3 3 5 5 5 2 1 5 5 5 5 5 1 3 5 5 5 5 5 3 5 5 5 6 6 6 5 6 6 6 7 7 7 0 7 7 7 8 8 8 1 8 8 8 8 5 1 1 1 1 1 0 0 0 1 1 1 0 2 3 3 5 7 6 5 2 7 5 6 3 5 5 2 0 5 1 3 5 5 0 1 8 1 1 2 3 5 2 3 5 5 5 1 5 0 1 0 0 0 0 1 1 0 0 5 [考え方]逆順(大きい順)にヒープを構成してから 最大値を1つずつ取り出して後ろから並べる。 ヒープソート 0 3 [アルゴリズム] Step 1 Aを逆順にヒープ化 Step 2 i←n-1 Step 3 temp←A[0] Step 4 DELETEMAX(i,A)を実行 Step 5 A[i]←temp Step 6 i←i-1 Step 7 i<2ならば停止。 そうでなければStep 3へ 2 8 5 5 1 6 7 逆順ヒープ化 8 7 5 8 7 5 2 6 3 5 0 1 5 2 3 5 6 1 5 0 [ヒープ化アルゴリズム] A[ (n-2)/2 +1],A[ (n-2)/2 +2],…,A[n-1]の各々を 1つの節点からなるヒープとみなす。 A[2i+1]とA[2i+2]を根とするヒープをA[i]を根とする ヒープに統合する操作HEPIFY(i,n,A)をi= (n-2)/2 , (n-2)/2 – 1,…,1,0に対して行う。 ←葉の部分! アルゴリズムとデータ構造 2013
5 0 3 2 5 8 5 7 1 6 5 5 8 5 5 5 5 5 8 0 3 0 8 0 7 3 5 5 0 3 2 5 8 5 7 1 6 7 8 7 8 0 3 7 7 5 5 5 0 3 2 6 8 5 7 1 5 5 8 0 7 3 5 7 2 6 6 3 8 5 5 0 2 1 1 5 5 2 8 5 5 0 8 7 6 3 5 2 1 5 6 7 2 8 3 5 5 6 6 7 3 5 6 5 7 8 0 6 3 5 2 1 5 5 7 8 2 6 3 5 0 1 5 0 3 5 2 6 3 5 6 5 7 8 5 7 2 5 6 2 3 6 5 3 0 5 1 0 5 1 5 2 8 5 2 2 3 5 3 5 6 6 5 1 5 7 1 1 5 5 2 0 1 5 2 1 5 0 1 5 2 1 1 5 0 0 1 6 7 0 temp=8 7 0 5 3 temp=1 1 temp=3 temp=5 temp=5 temp=5 3 2 1 6 6 1 temp=8 temp=3 temp=2 temp=5 temp=7 temp=7 5 5 5 0 temp=7 temp=5 temp=6 temp=6 temp=6 5 6 temp=8 7 2 2 2 2 1 3 0 2 3 1 1 5 5 5 5 0 1 5 6 2 2 5 5 5 5 0 5 7 6 5 2 5 3 5 0 1 5 5 0 0 2 3 5 5 5 6 7 8 2 3 5 5 0 1 5 2 0 3 2 2 1 2 1 3 3 0 1 2 0 0 5 0 3 1 1 5 5 1 5 3 5 5 5 5 5 6 5 5 6 6 7 6 6 7 7 8 7 7 8 8 8 8 5 3 2 1 6 6 0 0 2 1 5 1 5 1 5 5 3 0 0 2 2 1 5 5 5 1 3 5 5 3 3 5 5 5 5 5 6 6 6 0 0 7 7 7 1 1 8 8 8 8 8 0 0 0 1 1 6 5 2 5 3 5 0 1 8 2 2 5 3 3 5 5 5 5 2 2 5 5 0 0 1 1 5 0 3 3 0 5 5 5 5 5 6 0 2 2 7 7 1 1 8 8 3 3 5 5 0 0 7 7 8 8 2 5 3 5 0 1 3 3 5 2 2 3 3 5 5 1 1 1 0 1 1 7 5 5 2 6 3 5 0 1 5 0 2 3 5 6 1 0 0 0 0 1 0 5 ヒープソート(続き) HEPIFY(i,n,A): 要素数がnの配列Aにおいて、A[2i+1]とA[2i+2]を根とする逆順のヒープを、A[i]を根とする逆順のヒープに統合する。 Step 1 2i+1>n-1ならば停止。 そうでないならj←arg max A[k] を実行 Step 2 A[i]≧A[j]ならば停止。 そうでなければA[i]とA[j]の中身の入れ替え、 i←jとしてStep 1へ DELETEMAX(n,A): 要素数がnの逆順のヒープの最大値を削除する。 Step 1 A[0]←A[n-1] Step 2 HEPIFY(0,n-1,A)を実行 0 3 2 8 5 5 1 6 7 k∈{2i+1,2i+2},k<n アルゴリズムとデータ構造 2013
ヒープソートの最悪時間計算量 ヒープソートの最悪時間計算量は O(n log n) (証明) まず、ヒープ化するのにかかる時間計算量はO(n)であることを示す。 n個の要素からなるヒープの高さをhとすれば、高さがiの部分木の数は高々2h-iなので、計算時間は O(2h-1・1+2h-2・2+…+2・(h-1)+1・h) となる。2h≦nなので、 2h-1・1+2h-2・2+…+2・(h-1)+1・h ≦(n/2)・1+(n/22)・2+…+(n/2h-1)・(h-1)+n/2h・h≦(n/2)Σ(i/2i-1)≦2n ※Sh=Σ(i/2i-1)は、2Sh-Sh=2+Σ(1/2i-1) – h/2h-1より4以下に抑えられることに注意 よってヒープ化するのにかかる時間計算量はO(n)。 次にDELETEMAXをn-2回実行するのにかかる時間計算量は O(Σlog i)≦O(n log n) よって全体の時間計算量はO(n log n) h i=1 h-1 h i=1 i=1 n-1 i=2 アルゴリズムとデータ構造 2013
比較に基づくソートの漸近的下界 2要素の比較に基づくn要素のソートの 最悪(平均)時間計算量の漸近的下界は Ω(n log n) を挿入ソート 配列 a b c abc a>b? (証明) 簡単のため、全ての値は異なると仮定。 整列アルゴリズムは、比較命令の結果により 次の状態が決まり、状態ごとに次の処理が決まると 考えることができる。 したがって、計算の過程は状態を節点とする 二分木の根の状態から出発し、その節点の 処理である比較命令の結果により2つの子の どちらかに進み、最後には葉の節点まで到達 するパス(path)で表現できる。 異なる順列は同じ処理では整列できない ので必ず異なる葉に到達する。 到達した葉の深さは比較命令の回数であるので、少なくとも葉の深さの定数倍 の計算時間が必要である。 Y N bac abc a>c? b>c? Y N N Y bca acb bac abc b>c? a>c? Y Y N N bca cba cab acb アルゴリズムとデータ構造 2013
比較に基づくソートの漸近的下界(続き) したがって、最悪の場合、木の高さの定数倍の時間が必要である。 木の高さをhとすれば、木の葉の数は高々2hであるので 2h≧n! が成り立たなければならない。 スターリングの近似公式により、log n!は十分大きなnに対してn log n – n で近似できるので、適当なcを用いて h≧log n! ≧cn log n が十分大きなnに対して成り立つ。 したがってΩ(n log n)は、すべての比較に基づく整列アルゴリズムの 最悪時間計算量の漸近的下界といえる。 ln n! n ln n-n 1 (n→∞) アルゴリズムとデータ構造 2013