配列の「ソート度」を測定する標準的な方法があるかどうか疑問に思っていますか?可能性のある反転の中央値を持つ配列は、最大限にソートされていないと見なされますか?つまり、基本的には、並べ替えまたは逆並べ替えのいずれかが可能な限り行われないということです。
配列の「ソート度」を測定する標準的な方法があるかどうか疑問に思っていますか?可能性のある反転の中央値を持つ配列は、最大限にソートされていないと見なされますか?つまり、基本的には、並べ替えまたは逆並べ替えのいずれかが可能な限り行われないということです。
回答:
いいえ、アプリケーションによって異なります。sortednessの措置はしばしばとして参照される疾患の尺度の関数であり、にR、N < Nは別個の非負整数の全ての有限シーケンスの集合です。Estivill-Castro and Wood [1]による調査では、適応ソートアルゴリズムのコンテキストにおける障害の11の異なる測定値をリストして説明しています。
反転の数は場合によっては機能しますが、不十分な場合があります。[1]で与えられる例は、シーケンスです
2次数の反転がありますが、2つの昇順の実行のみで構成されています。ほぼソートされていますが、これは反転によってキャプチャされません。
Mannila [1]は、次のように(言い換えに基づいて)事前ソートを(比較ベースのアルゴリズムを中心に)公理化します。
してみましょう全順序集合を。次いで、マッピングMからΣ ⋆(から異なる要素の配列Σナチュラルに)である事前整列の尺度条件下記より満たしている場合。
場合次いでソートさMを(X )= 0。
もし有するX = X 1 ... X N、Y = Y 1 ... Y N とは、xはI < X I全てについて I 、J ∈ [ 1 ... N ]次に、 M (X )= M (Y )。
場合のサブシーケンスであるY ∈ Σ ⋆、次いで、M (X )≤ M (Y )。
すべてのi に対して場合[ 1 .. | X | ]とJ ∈ [ 1 .. | Y | ]いくつかのための X 、Y ∈ Σ ⋆次いで、M (X ⋅ Y )≤ M (X )+ M (Y )。
のすべてのための X ∈ Σ ⋆と ∈ E ∖ X。
そのような手段の例は
これらのメジャーを使用したランダム分布が定義されていることに注意してください。つまり、多かれ少なかれソートされたシーケンスを多かれ少なかれ作成します。これらは、Ewensのような分布と呼ばれます[2、Ch。4-5; 3、例12; 4]、その特別なケースはいわゆるマロー分布です。重みは、定数のパラメトリックあると果たします
。
が均一な分布を定義することに注意してください(すべてのmについて)。
これらの測定値に対して順列をサンプリングすることが可能であるため、この一連の作業は、ソートアルゴリズムのベンチマークを行う際に実際に役立ちます。
私は、シーケンスの「ソート」の独自の定義を持っています。
シーケンス[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つの要素を移動する必要があります。そして、シーケンスがソートされたとき、作業は必要ありません。
私の定義が理にかなっていることを願っています。
すばやく汚いものが必要な場合(合計記号が怖い)、ランダムに生成された数値で満たされた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になります。
マイケル