Nein, das hängt von Ihrer Anwendung ab. Die Sortierbarkeitsmaße werden oft als Unordnungsmaße bezeichnet , die Funktionen von bis , wobei die Sammlung aller endlichen Folgen verschiedener nichtnegativer Ganzzahlen ist. Die Umfrage von Estivill-Castro und Wood [1] listet und diskutiert 11 verschiedene Störungsmaße im Kontext adaptiver Sortieralgorithmen.N<NRN<N
Die Anzahl der Inversionen kann in einigen Fällen funktionieren, ist jedoch manchmal unzureichend. Ein Beispiel in [1] ist die Sequenz
⟨⌊n/2⌋+1,⌊n/2⌋+2,…,n,1,…,⌊n/2⌋⟩
das hat eine quadratische Anzahl von Inversionen, besteht aber nur aus zwei aufsteigenden Läufen. Es ist fast sortiert, aber dies wird nicht durch Inversionen erfasst.
[1] Estivill-Castro, Vladmir und Derick Wood. "Eine Übersicht über adaptive Sortieralgorithmen." ACM Computing Surveys (CSUR) 24.4 (1992): 441-476.
Mannila [1] axiomatisiert die Vorsortierung (mit Schwerpunkt auf vergleichenden Algorithmen) wie folgt (Paraphrasierung).
Beispiele für solche Maßnahmen sind die
Beachten Sie, dass Zufallsverteilungen mit diesen Maßen definiert wurden, dh so, dass Sequenzen, die mehr oder weniger sortiert sind, mehr oder weniger wahrscheinlich sind. Diese werden Ewens-ähnliche Verteilungen genannt [2, Kap. 4-5; 3, Beispiel 12; 4], ein Sonderfall davon ist die sogenannte Mallows- Verteilung. Die Gewichte sind parametrisch in einer Konstanten und erfüllenθ > 0
.Pr( X) = θm ( X)∑Y.& egr ; & Sgr;⋆∩ ∩| X|θm ( Y)
Man beachte, wie die gleichmäßige Verteilung definiert (für alle m ).θ = 1 m
Da es möglich ist, Permutationen für diese Kennzahlen effizient abzutasten, kann diese Arbeit in der Praxis beim Benchmarking von Sortieralgorithmen hilfreich sein.
quelle
Ich habe meine eigene Definition von "Sortierbarkeit" einer Sequenz.
Bei gegebener Folge [a, b, c,…] vergleichen wir sie mit der sortierten Folge, die dieselben Elemente enthält, zählen die Anzahl der Übereinstimmungen und dividieren sie durch die Anzahl der Elemente in der Folge.
Zum Beispiel
[5,1,2,3,4]
gehen wir bei gegebener Reihenfolge wie folgt vor:1) sortiere die Reihenfolge:
[1,2,3,4,5]
2) Vergleichen Sie die sortierte Sequenz mit dem Original, indem Sie sie jeweils um eine Position verschieben und die maximale Anzahl der Übereinstimmungen zählen:
3) Die maximale Anzahl von Übereinstimmungen ist 4, wir können die "Sortierbarkeit" als 4/5 = 0,8 berechnen.
Die Sortierbarkeit einer sortierten Sequenz wäre 1, und die Sortierbarkeit einer Sequenz mit in umgekehrter Reihenfolge angeordneten Elementen wäre 1 / n.
Die Idee hinter dieser Definition ist es, den minimalen Arbeitsaufwand abzuschätzen, der erforderlich ist, um eine Sequenz in die sortierte Sequenz umzuwandeln. Im obigen Beispiel müssen wir nur ein Element, die 5, verschieben (es gibt viele Möglichkeiten, aber das Verschieben von 5 ist am effizientesten). Wenn die Elemente in umgekehrter Reihenfolge platziert würden, müssten wir 4 Elemente verschieben. Und wenn die Reihenfolge sortiert wurde, ist keine Arbeit erforderlich.
Ich hoffe meine Definition macht Sinn.
quelle
Wenn Sie etwas schnelles und schmutziges brauchen (Summationszeichen machen mir Angst), habe ich in C ++ eine super einfache Unordnungsfunktion für eine Klasse namens Array geschrieben, die int-Arrays erzeugt, die mit zufällig generierten Zahlen gefüllt sind:
Function vergleicht einfach den Wert in jedem Element mit dem Index des Elements + 1, sodass ein Array in umgekehrter Reihenfolge einen Unordnungswert von 1 und ein sortiertes Array einen Unordnungswert von 0 hat.
Michael
quelle