1 / 10

アルゴリズムとデータ構造

アルゴリズムとデータ構造. 第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.

Download Presentation

アルゴリズムとデータ構造

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. アルゴリズムとデータ構造 第6回整列のアルゴリズム(2) アルゴリズムとデータ構造 2013

  2. 整列アルゴリズムの種類と時間計算量 最悪時間計算量の 漸近的上界 注)バケット数と桁数を定数とみた場合 アルゴリズムとデータ構造 2013

  3. 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

  4. 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

  5. マージソートの最悪時間計算量 マージソートの最悪時間計算量は 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

  6. 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

  7. 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

  8. ヒープソートの最悪時間計算量 ヒープソートの最悪時間計算量は 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

  9. 比較に基づくソートの漸近的下界 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

  10. 比較に基づくソートの漸近的下界(続き) したがって、最悪の場合、木の高さの定数倍の時間が必要である。 木の高さを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

More Related