Ich möchte eine Liste von Ganzzahlen effizient nach Duplikaten filtern, sodass nur die resultierende Menge gespeichert werden muss.
Ein Weg dies kann gesehen werden:
- wir haben einen Bereich von ganzen Zahlen mit N groß (sagen wir 2 40 )
- wir haben eine Funktion mit angeblich vielen Kollisionen (die Bilder sind gleichmäßig in S verteilt )
- wir müssen dann speichern , das heißt { f ( x ) | x ∈ S }
Ich habe eine ziemlich genaue (probabilistische) Schätzung dessen, was ist und kann daher Datenstrukturen im Voraus zuweisen (sagen wir | f [ S ] | ≈ 2 30 ).
Ich hatte einige Ideen, bin mir aber nicht sicher, was der beste Ansatz wäre:
- Ein Bitset kommt nicht in Frage, da der Eingabesatz nicht in den Speicher passt.
- eine Hash-Tabelle, aber (1) es erfordert etwas Speicher-Overhead, sagen wir 150% von und (2) die Tabelle muss beim Erstellen untersucht werden, was aufgrund des Speicheraufwands zusätzliche Zeit erfordert.
- eine "on the fly" -Sorte, vorzugsweise mit -Komplexität (Nichtvergleichssortierung). In Bezug darauf bin ich mir nicht sicher, was der Hauptunterschied zwischen Bucket Sort und Flashsort ist .
- Ein einfaches Array mit einem binären Suchbaum, für das jedoch erforderlich ist .
- Möglicherweise kann die Verwendung von Bloom-Filtern oder einer ähnlichen Datenstruktur hilfreich sein, um das Problem zu lösen (mit falsch positiven Ergebnissen).
Einige Fragen zu Stackoverflow scheinen sich mit solchen Dingen zu befassen ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java) -array-find-duplicates ), aber keines scheint meinen Anforderungen zu entsprechen.