スローソート

スローソートはソートアルゴリズムです。ユーモラスな性質を持ち、実用的ではありません。乗算と降伏の原理(分割統治反対をとったパロディ)に基づいた、消極的なアルゴリズムです。1984年にアンドレイ・ブローダーとホルヘ・ストルフィによって論文「ペシマルアルゴリズムとシンプレクシティ分析」[ 1 ] (最適アルゴリズム複雑性分析のパロディ) で発表されました

アルゴリズム

スローソートは再帰アルゴリズムです。

擬似コードの実装を以下に示します。

手順slowsort ( A [] , start_idx , end_idx ) // 配列範囲 A[start ... end] をインプレースでソートします。start_idx end_idx場合returnmiddle_idx := floor ( ( start_idx + end_idx ) / 2 ) slowsort ( A , start_idx , middle_idx ) // (1.1) slowsort ( A , middle_idx + 1 , end_idx ) // (1.2) if A [ end_idx ] < A [ middle_idx ] then swap ( A , end_idx , middle_idx ) // (1.3)slowsort ( A , start_idx , end_idx - 1 ) // (2)
  • 前半部分を再帰的にソートする。(1.1)
  • 後半部分を再帰的にソートする。(1.2)
  • 1.1と1.2の結果を比較して配列全体の最大値を求め、それをリストの最後に配置します。(1.3)
  • リスト全体を(最後にある最大値を除いて)再帰的にソートします。(2)

Haskellでの最適化されていない実装(純粋関数型) は次のようになります。

slowsort :: ( Ord a ) => [ a ] -> [ a ] slowsort xs | length xs <= 1 = xs |それ以外の場合= slowsort xs' ++ [ max llast rlast ] -- (2)ここでm = length xs ` div ` 2 l = slowsort $ take m xs -- (1.1) r = slowsort $ drop m xs -- (1.2) llast = last l rlast = last r xs' = init l ++ min llast rlast : init r

計算量分析

スローソートの時間計算量は関数 で与えられます。これは、最初の再帰呼び出し(1.1)と(1.2)の再帰関係をそれぞれ作成し、最後の再帰呼び出し(2)を合計し、この場合、他の操作を定数(+1)としてモデル化することで求められます。これにより、ランダウ記法における の下側漸近界は、任意のに対して として与えられます。したがって、スローソートは多項式時間ではありません Tn2Tn/2Tn11{\displaystyle T(n)=2T(n/2)+T(n-1)+1}Tn{\displaystyle T(n)}Ωn対数2n/2ϵ{\displaystyle \Omega \left(n^{\log_{2}(n)/(2+\epsilon)}\right)}ϵ>0{\displaystyle \epsilon >0}

参考文献

  1. ^ Andrei Broder、Jorge Stolfi (1984). 「ペシマルアルゴリズムとシンプレックス解析」(PDF) . ACM SIGACT News . 16 (3): 49– 53. CiteSeerX  10.1.1.116.9158 . doi : 10.1145/990534.990536 . S2CID  6566140
「 https://en.wikipedia.org/w/index.php?title=スローソート&oldid =1324355464」より取得