Lassen Sie mich damit beginnen, dass die Überprüfung der Identität double
s ist keine gute Praxis. Für weitere Details siehe: What every programmer should know about floating points.
Sie sollten robustere double
Vergleiche verwenden.
Jetzt, dass wir damit fertig sind, stellen wir uns Ihrem Problem.
Sie haben es mit der Variante Element Distinctness Problem mit Gleitkommazahl zu tun.
Im Allgemeinen, unter dem algebraischen Baum Berechnungsmodell, kann man es nicht besser machen als Omega(nlogn)
(Referenzen in diesem Thema: https://stackoverflow.com/a/7055544/572670).
Wenn Sie jedoch mit der double
s Identitätskontrollen halten werden (bitte nicht), können Sie ein stärkeres Modell und Hash-Tabelle verwenden O(n)
Lösung zu erreichen, indem eine Hash-Tabelle histogram Basis beibehalten (implementiert als HashMap<Double,Integer>
) der Elemente, und wenn Sie fertig sind, scannen Sie das Histogramm und geben Sie den Schlüssel mit dem höchsten Wert.
(Bitte tun Sie es nicht)
Es ist eine komplexe Art und Weise O(n)
Zeit basierend auf Hashing zu tun zu erreichen, auch wenn sie mit schwimmenden Punkte zu tun. Dies basiert auf dem Hinzufügen von Elementen zu mehreren Einträgen der Hash-Tabelle und unter der Annahme, dass eine Hash-Funktion einen Bereich von Elementen [x-delta/2,x+delta/2)
auf den gleichen Hash-Wert annimmt (so ist es Hashing in Chunks [x1,x2)->h1, [x2,x3)->h2, [x3,x4)->h3, ....
). Sie können dann eine Hash-Tabelle erstellen, in der ein Element x
mit 3 Werten hashed wird: x-3/4delta, x, x + 3/4delta
.
Dies garantiert, dass bei der Überprüfung eines gleichen Wertes später eine Übereinstimmung in mindestens einer der 3 Stellen, an denen Sie das Element platziert haben, vorhanden ist.
Dies ist wesentlich komplexer zu implementieren, aber es sollte funktionieren. Eine Variante davon kann in cracking the code interview, mathematische Frage 6. gefunden werden (So stellen Sie sicher, dass bei Ausgabe 5 aussehen, ist die Antwort in Ausgabe 4 falsch und wurde in der neueren Ausgabe festgelegt)
Als eine andere Seite Beachten Sie, dass Sie Ihre eigene Sortierung nicht implementieren müssen. Verwenden Sie
Die Überprüfung der Identität von 'double's ist keine gute Praxis. [Was jeder Programmierer über Fließkomma-Punkte wissen sollte] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – amit
Als eine Randnotiz ist dies Element Unterscheidbarkeit Problem, und es gibt keine O (n) Lösung unter dem algebraischen Baummodell. Wenn Sie jedoch mit der Identität der Doppelgänger bleiben, können Sie eine Hash-Tabelle verwenden, aber wieder - das ist eine schlechte Übung. – amit
@amit warum ist es eine schlechte Praxis, Hash-Tabellen in Fällen wie oben zu verwenden? – sAm