Projekt Euler # 22 mit Golang; gibt jedes Mal ein anderes Ergebnis zurück

8

Ich mache das Problem 22 von Project Euler mit Go, das ich neu bin, und mein Code gibt mir inkonsistente Ergebnisse, was bedeutet, dass jedes Mal, wenn ich das Programm starte, ein anderes Ergebnis angezeigt wird. Es ist immer sehr nah an dem, was ich gesehen habe, ist die richtige Antwort, aber liegt in mehreren hundert Punkten. Ich dachte ursprünglich, dass es vielleicht wegen Rundungsungenauigkeit entstanden sein könnte, aber ich habe überprüft und das ist nicht der Fall (denke ich). Ich würde es wirklich schätzen, wenn jemand darauf hinweisen könnte, was passieren könnte. Ich habe mehrere Tage lang Probleme mit meinem Code gefunden und konnte es nicht lösen oder ähnliche Probleme in Foren finden. Als eine Randnotiz habe ich das ursprünglich mit dem Golang Math / Big-Paket geschrieben und bekam die gleichen wechselnden Ergebnisse.

%Vor%     
Stephen Adams 07.05.2017, 06:09
quelle

2 Antworten

4

Die Verwendung von Fließkomma ist verdächtig, es ist ungenau. Die Iterationsreihenfolge über Maps ist nicht spezifiziert und es ist nicht garantiert, dass sie von einer Iteration zur nächsten identisch sind. Ihre Verwendung von Karten ist die wahrscheinlichste Erklärung für scheinbar zufälliges Verhalten.

Die erste Frage ist: Was ist die richtige Antwort?

%Vor%

Ausgabe:

%Vor%

So hat Project Euler erwartet, dass Sie die erste Version Ihrer Lösung schreiben. Ihre zweite Version sollte die einfache Auswahl mit einer schnelleren Sortierung wie Quicksort ersetzen.

Ihr Programm benötigt beispielsweise viel Zeit, um das falsche Ergebnis zu erzeugen:

%Vor%

Mein Programm erzeugt das korrekte Ergebnis und ist schneller:

%Vor%

Wenn wir meine Sortierung durch eine Sortierung ersetzen:

%Vor%

Das überarbeitete Programm erzeugt das richtige Ergebnis und es ist viel schneller:

%Vor%

Projekt Euler, Names Scores, Problem 22 geht es um schnelle Sortieralgorithmen, nicht um die triviale Berechnung von Scores.

Um ein stabiles Ergebnis aus Ihrem Code zu erhalten, geben Sie die delete -Anweisung aus:

%Vor%

Nun bleibt der Gleitkommafehler: Fließkomma-Arithmetik und IEEE Fließkomma .

Ihr Algorithmus erstellt einen ungefähren, nicht eindeutigen Gleitkomma wordValue s. Daher kann die zufällige Iteration über die Karte einige verschiedene Paare lowVal und lowValName auswählen und verschiedene Karteneinträge können gelöscht werden.

Nicht eindeutige wordValue s:

%Vor%     
peterSO 07.05.2017 08:12
quelle
3

Sie haben Recht, dass der Fehler in Ihrem Code mit Fließkommazahlen zusammenhängt. Nehmen Sie diese zwei Namen zum Beispiel:

%Vor%

Wenn Sie Ihren Code einfach für diesen Eingabesatz ausführen, erhalten Sie den folgenden Wert für wordsValues :

%Vor%

Wie Sie deutlich sehen können, bilden diese beiden Tasten aufgrund des Verlustes der Gleitkommazahlgenauigkeit denselben Wert ab. Und wie bereits erwähnt wurde, dass die Map-Iterationsreihenfolge in Go randomisiert ist, ist es möglich, dass Sie sortieren Der Algorithmus erzeugt ein falsches Ergebnis (einige Iterationen können BERNARDINE vor BERNARDINA setzen, da beide die gleichen Werte haben).

Da float64 bis zu 15 signifikante Ziffern unterstützt, könnten Namen mit mehr als 8 Zeichen Probleme bereiten.

Die beste Lösung besteht darin, ein bereits bestehendes Sortierverfahren zu verwenden, wie bereits von @peterSO oben beschrieben.

    
abhink 07.05.2017 09:39
quelle

Tags und Links