Hi Leute!
Ich habe folgendes Problem:
Ich habe aus mehreren XML Files die Daten in zwei große Hash-Listen eingelesen (etwa 100.000-200.000 Werte). Die Schlüssel sind eindeutige IDs (Strings), die Werte bestehen aus jeweils einem Array, das wiederum 4 Zahlen enthält.
Etwa so:
%myhash = ('ad3475' => [2.3, 4.5, 2.4, 8.9], 'ff3845' => [1.2, 2.4, 5.4, 2.0],...
Das Skript soll eine Mapping Tabelle erstellen. Dazu nehme ich momentan ein Eintrag aus dem einen Hash, gehe dann in einer Schleife durch alle Einträge aus dem zweiten hash und Suche nach dem besten Treffer. Der muss nicht gleich sein, sondern am nähsten dran. Das erreiche ich über den 4-dimensionalen euklidischen Abstand=sqrt((x1[0]-x2[0])^2 + (x1[1]-x2[1]) + ...)
x1 ist in diesem Fall das Array aus Hash 1 und x2 entsprechend das aus Hash 2. Ich muss aber inmmer die ganze Liste durch gehen, weil es ja immer noch einen besseren Treffer geben könnte. Das dauert ewig. Ich habe das mal Laufen lassen, und auf meinem Rechner würde das Mapping mit dem Algorithmus ca. 14TAGE(!!) dauern.
Ich muss mir also etwas besseres Ausdenken, und mir fällt nix ein. Es wäre schön, wenn man die eine LIste sortieren könnte und danach darin suchen könnte.
Aber mir fällt kein guter Sortieralgorithmus ein. Denn einfach nur nach dem ersten Array-Eintrag zu sortieren geht nicht, da es ja auf den eukl. Abstand Ankommt, und nicht auf die Gleichheit einzelner Werte. Hier ein Beispiel für das Problem:
Such Array: [5, 1, 1, 1]
Hash, in dem gesucht wird:
[1, 1, 1, 1] Abstand: 4
[2, 2, 2, 2] Abstand: 3,5
[3, 3, 3, 3] Abstand: 4
[4, 4, 4, 4] Abstand: 5,3
[5, 5, 5, 5] Abstand: 6,9
[6, 6, 6, 6] Abstand: 8,7
Daran sieht man, sortieren nach z.B. der ersten Zahl hätte als Ergebnis das Array [5,5,5,5] gebracht. Das Array mit dem geringsten Abstand ist allerdings [2,2,2,2].
Bitte um Hilfe!! Hat jemand eine Idee?
Gruß Jan