Kommentare
- Für mich gibt es
sorties.c: In function ‘timedelta’: sorties.c:82:18: error: dereferencing pointer to incomplete type double aa = a->tv_sec + (a->tv_nsec / 1000000000.0); ^ sorties.c:82:31: error: dereferencing pointer to incomplete type double aa = a->tv_sec + (a->tv_nsec / 1000000000.0); ^ sorties.c:83:18: error: dereferencing pointer to incomplete type double bb = b->tv_sec + (b->tv_nsec / 1000000000.0); ^ ...
in welcher Version von GCC soll ich dies ausführen?
li> I ' m unter FreeBSD unter Verwendung von clang 3.4.1. Sie können jedoch den Timing-Code für eine vollständig standardmäßige Version des Programms entfernen.
Antwort
Nicht bogobogosort
Die Art und Weise, wie Sie Ihr bogobogosort implementiert haben, ist tatsächlich schneller als bogosort becau Dies hat einige Gründe:
-
Nachdem Sie
k
Elemente erfolgreich bogosortiert haben, überprüfen Sie sofort, obk+1
Elemente werden sortiert. Dies bedeutet, dass Sie, wenn Sie bei einem vorherigen Shufflem
-Elemente alle der Reihe nach gemischt haben, nach dem Sortieren der ersten beiden Elemente sofortm
.Angenommen, Sie erreichen 5 Karten und schlagen dann fehl. Sie mischen 5 Karten und beginnen dann bei 2. Wenn diese 5 Karten in sortierter Reihenfolge vorliegen, erreichen Sie sofort 6, sobald Sie die ersten 2 Karten in die richtige Reihenfolge bringen.
-
Aufgrund von Punkt 1 ist Ihr Bogobogosort tatsächlich schneller als der Bogosort, da nur
n-1
Karten anstelle vonn
sortiert werden müssen . Nachdemn-1
-Karten sortiert wurden, überprüft es die Reihenfolge dern
-Karten und schlägt möglicherweise fehl. Wenn dies fehlschlägt, werdenn
-Karten neu gemischt, sodass jedes Mal, wennn-1
-Karten sortiert wird, eine1/n
Chance auf Erfolg. Die Gesamtzahl der gemischten Karten liegt also in der Größenordnung von(n-1) * (n-1)! * n
, was sich zu(n-1) * n!
vereinfacht, verglichen mit dem Bogosort, dern * n!
-Karten.Ich glaube, dass bei jedem Schritt das gleiche Prinzip gilt, daher ist die Zeit sogar kürzer als
(n-1) * n!
. Ich bin mir der genauen Mathematik nicht sicher, aber nach dem Ausführen Ihres Programms scheint der Bogobogosort ungefähr zur gleichen Zeit wie der Bogosog mit einer Karte weniger zu laufen. Dh Your_bogobogosort (n) = Bogosort (n-1).
Ein richtiger Bogobogosort
Ich habe Ihre Bogobogosort-Funktion so umgeschrieben:
unsigned long bogobogosort(int *data, size_t n) { unsigned long c = 0; size_t b = 2; while (1) { if (sorted(data, b)) { if (b == n) break; b++; } else { b = 2; } c += b; shuffle(data, b); } return c; }
Der Hauptunterschied besteht darin, dass nach jedem Erfolg, bei dem b
erhöht wird, das Deck neu gemischt wird, um zu verhindern, dass Punkt 1 oben auftritt. Mit dieser Änderung erhalte ich die folgende Ausgabe:
% ./a.out 6 bogosort shuffled 1044 cards in 0.000013 seconds. bogobogosort shuffled 54464568 cards in 0.500339 seconds.
Kommentare
- Laut der Beschreibung bei Wikipedia prüft der erste Teil von bogosort auf Bestellung Daten. Wenn die ersten N Elemente in Ordnung sind, führt ein Bogosort dieser N Elemente kein einziges Shuffle durch. Wenn ich also
0 1 2 3 4 6 5
und Bogobogosort habe, gehe ich von Bogosort von 2 auf 5 Elemente ohne Mischen, dann 6 Elemente mischen (und zurück zu bo gobogosorting 2). - @pmg Wenn dies die richtige Definition von bogobogosort ist, stellt sich heraus, dass es schneller als bogosort ist (wie das Programm OP ' beweist). . Ich ' bin nicht mit den Ursprüngen von bogobogosort vertraut, aber damit es " bis zum Hitzetod des Universums " Wie behauptet, sollte es eher so aussehen, wie ich es geschrieben habe.