Leser: 29
2010-01-19T17:47:06 pqalso dank der komplexität von (merge)sort O(n log(n)) ist das ganze nun wieder ineffizienter als wenn man die daten in einem hash plus array vorhält O(n).
2010-01-19T17:47:06 pqausserdem finde ich die inneren hashes sehr befremdlich. da würde statt
{ zahl => dieselbe_zahl }
auch einfach die zahl als wert ausreichen.
2010-01-19T17:47:06 pqletztendlich wäre SQLite wohl langfristig die klügste wahl.
2010-01-19T17:52:50 bianca2010-01-19T17:47:06 pqalso dank der komplexität von (merge)sort O(n log(n)) ist das ganze nun wieder ineffizienter als wenn man die daten in einem hash plus array vorhält O(n).
Sorry, das ist nicht meine Welt, k.A. Hat das etwas mit meinem Lösungsvorschlag zu tun?
2010-01-19T17:59:05 pq2010-01-19T17:52:50 bianca2010-01-19T17:47:06 pqalso dank der komplexität von (merge)sort O(n log(n)) ist das ganze nun wieder ineffizienter als wenn man die daten in einem hash plus array vorhält O(n).
Sorry, das ist nicht meine Welt, k.A. Hat das etwas mit meinem Lösungsvorschlag zu tun?
es ging hier um speicherverbrauch und geschwindigkeit. mit deinem algorithmus von O(n log(n)) bist du nunmal langsamer als mit einem algorithmus von O(n).
wenn das nicht deine welt ist, solltest du vielleicht lieber gar nix dazu sagen, denn genau darum geht es hier.
was habe ich von einem algorithmus, wenn durch das sort ein teil des geschwindigkeitsvorteils wieder zunichte gemacht wird?
ich bin jetzt doch etwas verwirrt, dass du hier code präsentierst und dann sagst, algorithmus-komplexitäten seien nicht deine welt. schliesslich war die laufzeit des programms ja einer der aufhänger dieses teilthreads.
bitte klär mich auf, falls du etwas ganz anderes im sinn hattest.
2010-01-19T18:09:37 biancaMoment, jetzt läuft hier was daneben!
Der Fragesteller durchläuft für jedes Element von Liste A jedes weitere Element von Liste B, also Menge A mal Menge B, um doppelte zu finden.
Meine Lösung durchläuft dafür die Liste garnicht, es baut auf if exists.....
Ich habe den ganzen Heckmeck mit der ursprünglichen Sortierung der Liste nur gemacht, weil meine Hash-Lösung insofern "angegriffen" (sachlich, nicht persönlich!) wurde,
Quoteals man da keine Reihenfolge hat, was in meinen Augen zwar technisch zutrifft, weil Perl von Natur aus ein Hash nicht sortiert, man dies aber durch eine zweite Dimension ganz leicht beheben kann.
Angenommen, der Fragesteller braucht die Reihenfolge seiner Liste garnicht (wissen wir ja bisher nicht), kommt meine Lösung ohne jegliches Sort aus und hat die gesamte Liste nur einmal im Speicher.
Quote"würdest du einen der arrays in einem hash ablegen, um im anderen duplikate zu löschen, würdest du, ich sag jetzt einfach mal, 3 mal soviel speicher verbrauchen, aber ein vielfaches an zeit sparen."
Quote"Das hab ich jetzt wiederum nicht verstanden.
Wenn ich den Datenbestand in einem Hash ablege und mit einer Schleife über das Zuwachs-Array rutsche und dabei Values zu bestehenden Keys ersetze/erweitere oder was auch immer und dadurch doppelte Keys von vorn herein nicht entstehen können, wieso verbrauche ich dann wesentlich mehr Speicher?"
QuoteDer Datenbestand *ist* aber nicht in einem Hash abgelegt, sondern in einem Array.
QuoteWarum sollte jemand das über den Weg machen? Wie man Daten ablegt entscheidet man doch beim Einlesen und nicht irgendwann später, indem man nochmal umschaufelt von Array in Hash? Warum also sollte man Daten nicht gleich beim Einlesen im Hash ablegen?
Quotevielleicht, weil er die reihenfolge behalten will? nur mal so als beispiel.
QuoteWas hat das mit Hash oder Array zu tun?
Quotedaraufhin hast du meine aussage, es würde mehr speicher verbrauchen, angezweifelt und hast code mit einem hash präsentiert, der die datenbasis datei komplett ignoriert.
Quotehabe ich *irgendwo* behauptet, der fragesteller würde die reihenfolge brauchen?
Quotevielleicht, weil er die reihenfolge behalten will? nur mal so als beispiel.
2010-01-19T18:43:56 biancapqvielleicht, weil er die reihenfolge behalten will? nur mal so als beispiel.
[...]
biancaWas hat das mit Hash oder Array zu tun?
Dann kam MatthiasW mit seinem "eindrucksvollen" Beispiel dazwischen [...]
2010-01-19T21:45:08 MatthiasWDaraufhin erntete ich von dir zu allererst eine Abwertung meines Versuchs, dir diese Tatsache aufzuzeigen.
2010-01-20T08:02:33 biancaAllerdings könnte man Dein wirklich plattes Beispiel auch als Angriff werten. Denn Du musst mich ja für so doof halten, dass ich nicht weiß, dass ein Hash nicht sortiert ist.
QuoteAngenommen, der Fragesteller braucht die Reihenfolge seiner Liste garnicht (wissen wir ja bisher nicht), kommt meine Lösung ohne jegliches Sort aus und hat die gesamte Liste nur einmal im Speicher.
2010-01-19T18:09:37 biancaEdit: Ich vergaß zu erwähnen, dass das sort in JEDEM Fall nur einmal bei der Ausgabe zwecks ursprünglicher Sortierung gemacht wird, was man aber ja eigentlich auch dem Code entnehmen kann aber anscheinend dennoch nicht verstanden wurde (?)
2010-01-19T17:59:05 pqes ging hier um speicherverbrauch und geschwindigkeit. mit deinem algorithmus von O(n log(n)) bist du nunmal langsamer als mit einem algorithmus von O(n).
2010-01-20T08:08:27 biancaDas heißt, durch mein abschließendes sort werden alle vorher gewonnenen Geschwindigkeitsvorteile wieder aufgefressen, richtig?
QuoteUnd wenn man die Sortiermethode für sort ändert?
2010-01-19T17:52:50 bianca2010-01-19T17:47:06 pqletztendlich wäre SQLite wohl langfristig die klügste wahl.
Schon, aber wenn Fragesteller damit irgendwelche Logs etc. beackern will, wird er die niemals ohne Zwischenschritt inkl. damit zusammenhängender Schnittstellen und Fehlerquellen in eine DB bekommen. Und ob das lohnt, nur um Doppelte zu fischen?
2010-01-19T18:15:05 pq$dbh->do("INSERT INTO foo (bar) VALUES (?)", undef, $wert);
und das für jeden neuen wert. dank unique constraint sind duplikate ausgeschlossen, und sqlite kümmert sich dank index darum, dass das auch schnell vonstatten geht.
ich seh da jetzt eigentlich nichts, was dagegen spricht.
2010-01-19T18:17:44 biancaDagegen spricht der DB-Zugriff.
QuoteWarum sollte man das nicht gleich mit einem Hash im Speicher machen?
QuoteInsbesondere dann, wenn vielleicht in der Umgebung gerade keine DB zur Verfügung steht?