013
16.01.2009, 17:16 Uhr
0xdeadbeef
Gott (Operator)
|
Naja, um doppelte zu markieren, musst du wissen, dass sie doppelt sind. Das Problem, in das du da unweigerlich läufst, ist, dass du einen großen Haufen RAM brauchst. Auf einer 32-Bit-Maschine sind das schon 512MiB, zusätzlich zu den 400MB, die der Vektor frisst und der unbekannten Größe, die der Zielcontainer fressen wird - das wird schon schwierig, aber jetzt stell dir mal vor, das ganze liefe auf einer 64-Bit-Maschine. Außerdem, selbst wenn du genug Speicher hast, ändert sich dein Laufzeitverhalten dramatisch; anstatt O(n * log(n)) oder O(n) mit der Menge der Elemente skalierst du linear mit der Menge der möglichen Werte, bzw. exponentiell mit der Registerbreite der Maschine. Jedenfalls theoretisch; je nachdem, wie der Kernel sein Paging etc. implementiert, kann dabei im Endeffekt alles mögliche rauskommen. Nur schneller wird es nicht.
Ich kann jetzt nicht beurteilen, wie sich die Menge der eingelesenen Werte zur Registerbreite der Maschine verhält, sofern überhaupt ein Zusammenhang besteht. Aber dass dabei am Ende ein Geschwindigkeitsgewinn rauskommen soll, scheint mir unrealistisch.
Du könntest wohl vorher das Array durchlaufen, um den kleinsten und größten Wert zu ermitteln und deine Bitmaske entsprechend zu dimensionieren; damit kämst du zumindest auf eine bessere, wenn auch schwieriger auszuklamüsernde Laufzeit (abhängig sowohl von der Menge der Elemente als auch ihrer Streuung), aber eine Hashtable scheint mir doch der sinnvollere Weg.
Allerdings...bei solchen Datenmengen scheint mir eine Datenbank langsam schon sinnvoll. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 16.01.2009 um 17:20 Uhr von 0xdeadbeef editiert. |