Bogosort vs bogobogosort [geschlossen]

geschlossen. Diese Frage ist nicht zum Thema . Derzeit werden keine Antworten akzeptiert.

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.

  • Ich ' stimme ab, um diese Frage als nicht zum Thema gehörend zu schließen, da jede vernünftige Definition vorliegt von " verbessern " kann nicht auf diesen Code angewendet werden, der nur die Leistung so schlecht wie möglich machen soll.
  • Ich ' habe die Frage geschlossen, weil der Code ' nicht wie beabsichtigt funktioniert (Sie ' frage, warum bogobogosort ' nicht langsam genug funktioniert).
  • Es gibt ' eine bessere Beschreibung von der Bogobogosort-Algorithmus unter dangermouse.net/esoteric/bogobogosort.html – dies implementiert den dort beschriebenen Algorithmus nicht.
  • 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:

    1. Nachdem Sie k Elemente erfolgreich bogosortiert haben, überprüfen Sie sofort, ob k+1 Elemente werden sortiert. Dies bedeutet, dass Sie, wenn Sie bei einem vorherigen Shuffle m -Elemente alle der Reihe nach gemischt haben, nach dem Sortieren der ersten beiden Elemente sofort m.

      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.

    2. Aufgrund von Punkt 1 ist Ihr Bogobogosort tatsächlich schneller als der Bogosort, da nur n-1 Karten anstelle von n sortiert werden müssen . Nachdem n-1 -Karten sortiert wurden, überprüft es die Reihenfolge der n -Karten und schlägt möglicherweise fehl. Wenn dies fehlschlägt, werden n -Karten neu gemischt, sodass jedes Mal, wenn n-1 -Karten sortiert wird, eine 1/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, der n * 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.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.