「ソート度」の測定方法


34

配列の「ソート度」を測定する標準的な方法があるかどうか疑問に思っていますか?可能性のある反転の中央値を持つ配列は、最大限にソートされていないと見なされますか?つまり、基本的には、並べ替えまたは逆並べ替えのいずれかが可能な限り行われないということです。

回答:


31

いいえ、アプリケーションによって異なります。sortednessの措置はしばしばとして参照される疾患の尺度の関数であり、RN < Nは別個の非負整数の全ての有限シーケンスの集合です。Estivill-Castro and Wood [1]による調査では、適応ソートアルゴリズムのコンテキストにおける障害の11の異なる測定値をリストして説明しています。N<NRN<N

反転の数は場合によっては機能しますが、不十分な場合があります。[1]で与えられる例は、シーケンスです

n/2+1,n/2+2,,n,1,,n/2

2次数の反転がありますが、2つの昇順の実行のみで構成されています。ほぼソートされていますが、これは反転によってキャプチャされません。


[1] Estivill-Castro、Vladmir、およびDerick Wood。「適応ソートアルゴリズムの調査。」ACM Computing Surveys(CSUR)24.4(1992):441-476。


2
コンテキストは、反転数が中央値に近いn個の要素のランダムな順列で、クイックソートのパフォーマンスが比較的低い理由を理解しようとしています。
ロバートS.バーンズ

1
素晴らしい例、それはまさに私が探していた情報です。
ロバートS.バーンズ

1
Estivill・カストロとウッドがあることを確認のために、このための参照。
ペドロデュッソ

10

Mannila [1]は、次のように(言い換えに基づいて)事前ソートを(比較ベースのアルゴリズムを中心に)公理化します。

してみましょう全順序集合を。次いで、マッピングMからΣ (から異なる要素の配列Σナチュラルに)である事前整列の尺度条件下記より満たしている場合。ΣmΣΣ

  1. 場合次いでソートさMをX = 0XΣm(X)=0

  2. もし有するX = X 1 ... X NY = Y 1 ... Y N とは、xはI < X IX,YΣX=x1xnY=y1yn全てについて I J [ 1 ... N ]次に、 M X = M Y xi<xiyi<yji,j[1..n]m(X)=m(Y)

  3. 場合のサブシーケンスであるY Σ 、次いで、M X M Y XYΣm(X)m(Y)

  4. すべてのi に対して場合[ 1 .. | X | ]J [ 1 .. | Y | ]いくつかのための X Y Σ 次いで、M X Y M X + M Y xi<yji[1..|X|]j[1..|Y|]X,YΣm(XY)m(X)+m(Y)

  5. のすべてのための X Σ E Xm(aX)|X|+m(X)XΣaEX

そのような手段の例は

  • 反転の数、
  • スワップの数、
  • 左から右の最大値ではない要素の数、および
  • 最長の増加サブシーケンスの長さ(入力長から減算)。

これらのメジャーを使用したランダム分布が定義されていることに注意してください。つまり、多かれ少なかれソートされたシーケンスを多かれ少なかれ作成します。これらは、Ewensのような分布と呼ばれます[2、Ch。4-5; 3、例12; 4]、その特別なケースはいわゆるマロー分布です。重みは、定数のパラメトリックあると果たしますθ>0

Pr(X)=θm(X)YΣΣ|X|θm(Y)

が均一な分布を定義することに注意してください(すべてのmについて)。θ=1m

これらの測定値に対して順列をサンプリングすることが可能であるため、この一連の作業は、ソートアルゴリズムのベンチマークを行う際に実際に役立ちます。


  1. H. Mannila(1985)による事前分類の尺度と最適な分類アルゴリズム
  2. 対数コンビナトリアル構造:R. Arratia、AD Barbour、S。Tavaréによる確率論的アプローチ(2003)
  3. A. Borodin、P。Diaconis、J。Fulman(2010)による数字のリスト(および他の1つの依存する決定プロセス)の追加について
  4. N. Auger等によるEwensのような分布とアルゴリズムの分析 (2016)

3

私は、シーケンスの「ソート」の独自の定義を持っています。

シーケンス[a、b、c、…]が与えられた場合、同じ要素を含むソートされたシーケンスと比較し、一致数をカウントし、シーケンス内の要素数で除算します。

たとえば、[5,1,2,3,4]次のようにシーケンスを指定します。

1)シーケンスをソートします。 [1,2,3,4,5]

2)一度に1つの位置を移動し、一致の最大数をカウントすることにより、ソートされたシーケンスを元のシーケンスと比較します。

        [5,1,2,3,4]
[1,2,3,4,5]                            one match

        [5,1,2,3,4]
  [1,2,3,4,5]                          no matches

        [5,1,2,3,4]
    [1,2,3,4,5]                        no matches

        [5,1,2,3,4]
      [1,2,3,4,5]                      no matches

        [5,1,2,3,4]
        [1,2,3,4,5]                    no matches

        [5,1,2,3,4]
          [1,2,3,4,5]                  4 matches

        [5,1,2,3,4]
            [1,2,3,4,5]                no matches

                ...

         [5,1,2,3,4]
                 [1,2,3,4,5]            no matches

3)一致の最大数は4です。4/ 5 = 0.8として「ソート度」を計算できます。

ソートされたシーケンスのソート度は1になり、要素が逆の順序で配置されたシーケンスのソート度は1 / nになります。

この定義の背後にある考え方は、任意のシーケンスをソートされたシーケンスに変換するために必要な作業の最小量を推定することです。上記の例では、5つの要素を1つだけ移動する必要があります(多くの方法がありますが、5を移動するのが最も効率的です)。要素が逆の順序で配置される場合、4つの要素を移動する必要があります。そして、シーケンスがソートされたとき、作業は必要ありません。

私の定義が理にかなっていることを願っています。


良いアイデア。同様の定義はExcであり、Juhoの回答で言及された論文の障害の3番目の定義です。Excは、シーケンスをソート順に並べ替えるのに必要な操作の数です。
Apass.Jack


-2

すばやく汚いものが必要な場合(合計記号が怖い)、ランダムに生成された数値で満たされたint配列を生成するArrayという名前のクラス用にC ++で超簡単な無秩序関数を作成しました。

void Array::disorder() {
    double disorderValue = 0;
    int counter = this->arraySize;
    for (int n = 0; n < this->arraySize; n++) {
        disorderValue += abs(((n + 1) - array[n]));
//      cout << "disorderValue variable test value = " << disorderValue << endl;
        counter++;
    }
    cout << "Disorder Value = " << (disorderValue / this->arraySize) / (this->arraySize / 2) << "\n" << endl;
}

関数は単純に各要素の値を要素のインデックス+ 1と比較するため、逆順の配列の無秩序値は1になり、ソートされた配列の無秩序値は0になります。

マイケル


これはプログラミングサイトではありません。無秩序の概念を定義し、線形時間で計算できることに言及すれば十分でしょう。
ユヴァルフィルマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.