Hier ist ein ziemlich verbreitetes Muster für Sortieralgorithmen:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
Diese Algorithmen funktionieren gut, da die Indizes i
und j
anhand des Status der Liste sorgfältig ausgewählt werden l
.
Was aber, wenn wir nicht sehen l
konnten und einfach blind wählen mussten? Wie schnell könnten wir dann die Liste sortieren?
Ihre Herausforderung besteht darin, eine Funktion zu schreiben, die ein zufälliges Indexpaar mit der angegebenen Länge von ausgibt l
. Insbesondere müssen Sie zwei Indizes ausgeben i, j
, mit 0 <= i < j < len(l)
. Ihre Funktion sollte auf jeder Länge der Liste funktionieren, sie wird jedoch auf einer Liste mit einer Länge von 100 bewertet.
Ihre Punktzahl ist die mittlere Anzahl von Indexauswahlmöglichkeiten, die erforderlich sind, um eine gleichmäßig zufällig gemischte Liste nach dem oben genannten Muster zu sortieren, wobei die Indizes gemäß Ihrer Funktion ausgewählt werden.
Ich werde Einsendungen bewerten und dabei die mittlere Anzahl der Indexauswahl über 1000 Versuche auf einer gleichmäßig zufällig gemischten Liste mit einer Länge von 100 ohne wiederholte Einträge verwenden.
Ich behalte mir das Recht vor, weniger Tests durchzuführen, wenn die Einsendung eindeutig nicht wettbewerbsfähig ist oder nicht beendet wird, und ich werde mehr Tests durchführen, um die besten Konkurrenten zu differenzieren und einen einzigen Gewinner zu finden. Wenn mehrere Top-Einreichungen innerhalb der Fehlergrenze meiner Rechenressourcen verbleiben, erkläre ich die frühere Einreichung zum Gewinner, bis weitere Rechenressourcen zur Geltung gebracht werden können.
Hier ist ein Beispiel für ein Bewertungsprogramm in Python:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
Ihre Funktion behält möglicherweise keinen veränderlichen Status bei, interagiert nicht mit globalen Variablen, wirkt sich auf die Liste l
usw. aus. Die einzige Eingabe Ihrer Funktion muss die Länge der Liste sein l
und ein geordnetes Paar von Ganzzahlen im Bereich [0, len(l)-1]
(oder passend für Ihre Sprache) ausgeben Indexierung der Liste). Fühlen Sie sich frei zu fragen, ob etwas in den Kommentaren erlaubt ist.
Die Beiträge können in einer beliebigen Sprache eingereicht werden. Bitte legen Sie ein Bewertungsgeschirr bei, falls noch keines für Ihre Sprache veröffentlicht wurde. Sie können eine vorläufige Punktzahl veröffentlichen, aber ich werde einen Kommentar mit der offiziellen Punktzahl hinterlassen.
Die Bewertung ist die mittlere Anzahl von Schritten zu einer sortierten Liste auf einer gleichmäßig zufällig gemischten Liste mit einer Länge von 100. Viel Glück.
quelle
Antworten:
Python, Score = 4508
Half Life 3 bestätigt.
Python, Score = 11009
Anscheinend ist eine zufällige Blasensorte nicht viel schlimmer als eine normale Blasensorte.
Optimale Verteilungen für kleine Längen
Es gibt keine Möglichkeit, diese Länge auf 100 zu erweitern, aber es ist trotzdem interessant, sie zu betrachten. Ich habe optimale Verteilungen für kleine Fälle (Länge ≤ 7) mit Gradientenabstieg und viel Matrixalgebra berechnet. Die k- te Spalte zeigt die Wahrscheinlichkeit für jeden Swap im Abstand k .
quelle
h
der Abstand zwischen den ausgetauschten Elementen ist. Es repräsentiert weder die Vorder- noch die Rückseite.Ergebnis: 4627
Probieren Sie es online!
Gibt Zufallsindizes aus, deren Abstand einheitlich gewählt wird
[1,1,4,16]
. Die Idee ist eine Mischung aus 1-Schritt-Swaps mit Swaps in größerem Maßstab.Ich habe diese Werte für Listen mit einer Länge von 100 von Hand angepasst, und sie sind wahrscheinlich alles andere als optimal. Einige Maschinensuchen könnten wahrscheinlich die Verteilung über Entfernungen für die Strategie des zufälligen Paars mit der gewählten Entfernung optimieren.
quelle
Ergebnis: 28493
Probieren Sie es online!
Diese Lösung wählt nur unterschiedliche Werte für
x
undy
zufällig aus dem Bereich aus und gibt sie in sortierter Reihenfolge zurück. Soweit ich das beurteilen kann, besser , dies führt als die Wahlx
dann die Wahly
von den übrigen Werten.quelle
Python, Kerbe: 39525
Probieren Sie es online aus.
quelle
Python, Punktzahl ≈ 5000
Mit einer Reihe von Epsilon-Werten versucht, scheint 0,25 die beste zu sein.
Ergebnis ≈ 8881
Ein anderer Versuch. Nicht so gut, und es stirbt schrecklich mit Länge nicht durch die Anzahl der Segmente teilbar, aber immer noch Spaß zu bauen.
quelle
Ergebnis: 4583
Probieren Sie es online!
Ich habe keine Ahnung warum. Ich habe gerade Sequenzen ausprobiert, die auf Wikipedia für Shellsort aufgelistet sind . Und dieser scheint am besten zu funktionieren. Es wird eine ähnliche Punktzahl mit dem einen xnor angezeigt .
quelle
candidates
sollte es funktionieren, die Funktion als globale Variable zu verlassen.Python 2 , 4871
Probieren Sie es online!
quelle