Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.
PQ Discord Server: #planetquake Spenden? Hier entlang!
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.
PQ Discord Server: #planetquake Spenden? Hier entlang!
Mehrfache Dateien finden u. automatisch durch hard links ersetzen?
Achso, ein Array von Hash-Werten; das geht beim Ersetzen der hard links auch (aber nicht beim Erstellen, bei dem Duplikate ersetzt werden).
Nach einmaligem qsort auf das Array bekommt man anschließend mit bsearch schnell heraus, ob eine Datei ein hard link ist.
Ob das effizienter ist, als mit qsort alle Dateien zu sortieren und dabei (als Nebeneffekt, so wie bei dupmerge) hard links zu expandieren, hängt wohl vom Einzelfall ab.
Das O(n*ln(n)) mit qsort reicht mir.
Nach einmaligem qsort auf das Array bekommt man anschließend mit bsearch schnell heraus, ob eine Datei ein hard link ist.
Ob das effizienter ist, als mit qsort alle Dateien zu sortieren und dabei (als Nebeneffekt, so wie bei dupmerge) hard links zu expandieren, hängt wohl vom Einzelfall ab.
Das O(n*ln(n)) mit qsort reicht mir.
Also nach einiger googelei habe ich die Antwort auf Seiten wie
http://www.infos24.de/perle/handbuch/7_ ... n_hash.htm
gefunden, aber ohne spezielle Hardware kann so ein Zugriff weder im Mittel noch allgemein in O(1) erfolgen; dafür brächte man Spezial-Hardware wie Assoziativ-Speicher, aber damit kann man auch Sachen wie allgemeines Sortieren mit O(n) machen; wenn der Rechner zudem mind. n CPUs hat, geht es sogar in O(1).
http://www.infos24.de/perle/handbuch/7_ ... n_hash.htm
gefunden, aber ohne spezielle Hardware kann so ein Zugriff weder im Mittel noch allgemein in O(1) erfolgen; dafür brächte man Spezial-Hardware wie Assoziativ-Speicher, aber damit kann man auch Sachen wie allgemeines Sortieren mit O(n) machen; wenn der Rechner zudem mind. n CPUs hat, geht es sogar in O(1).
Indem man das Element gar nicht erst sucht.. mit den assoziativen Speichern lagst du garnicht so falsch, aber Hardware braucht man dafür nicht.
Hast du die Definition durchzulesen? Hier ist eine, die weiter auf die Theorie eingeht, falls dir die andere zu knapp war:
http://ciips.ee.uwa.edu.au/~morris/Year ... ables.html
Hast du die Definition durchzulesen? Hier ist eine, die weiter auf die Theorie eingeht, falls dir die andere zu knapp war:
http://ciips.ee.uwa.edu.au/~morris/Year ... ables.html
Du verwechselt das; O(1) wäre der best case für n Elemente - ingesammt also O(n) im best case. Demgegenüber ist O(n*ln(n)) nicht viel schlechter, zumal ja bei einer Anwendung noch additive u. multiplikative Konstanten wichtig sind und beim Hash sicherlich O(ln(n)) realistisch ist durch die Kollsionen.
Stimmt, da hab ich Eier und Bananen verglichen. Nochmal die Anzahl Schritte, bis man eine traversierbare Struktur hat:
Hash: einfach n-mal einfügen: n * O(1)
Liste+Sortieren: n-mal einfügen dann sortieren: n * O(1) + O(n log n)
Binärbaum: n-mal einfügen und balancieren: n * O(log n) + x
Wir haben also O(n) mit dem Hash und O(n log n) bei beiden anderen Methoden, wobei der Binärbaum in der Praxis wohl ein gutes Stück schlechter abschneidet.
Hash: einfach n-mal einfügen: n * O(1)
Liste+Sortieren: n-mal einfügen dann sortieren: n * O(1) + O(n log n)
Binärbaum: n-mal einfügen und balancieren: n * O(log n) + x
Wir haben also O(n) mit dem Hash und O(n log n) bei beiden anderen Methoden, wobei der Binärbaum in der Praxis wohl ein gutes Stück schlechter abschneidet.
Naja, das mit dem O(1) beim Hash setzt voraus, dass es wenig Kollisionen gibt, aber bei den einigen hunderttausend Dateien in meiner noch kleinen CD/DVD-Sammlung wird es wohl nicht gerade wenige Kollisionen geben.
Zudem denke ich auch an Skalierbarkeit; bei ähnlichen Dateien kann man mit qsort benachbarte Dateien leicht auf ihre Änlichkeit leicht testen, während es mit Hashes komplizierter ist, insbesondere mit variable vorgebbarer Ähnlichkeit wie z. B. Hamming-Distanz.
Zudem denke ich auch an Skalierbarkeit; bei ähnlichen Dateien kann man mit qsort benachbarte Dateien leicht auf ihre Änlichkeit leicht testen, während es mit Hashes komplizierter ist, insbesondere mit variable vorgebbarer Ähnlichkeit wie z. B. Hamming-Distanz.
Die Anzahl der Kollisionen hängt vom Füllgrad des Hashes ab (es sei denn, die Hashing-Funktion ist schlecht) -- und die libc-Hashtable-Funktionen vergrössern den Hash bei Bedarf. Ich habe in Perl schon oft problemlos mit Hashes von ein paar zehntausend Einträgen Grösse hantiert.
Allerdings beisst du dir mit dem Argument grosser Zahlen selber in den Hintern, denn gerade bei n=100.000 wird der Unterschied zwischen O(n) und O(n log n) schon deutlich spürbar...
Ausserdem verstehe ich nicht, was du von DVDs faselst; die Problemstellung ist, dass du herausfinden möchtest, welche Hardlinks zu welchen merfach verlinkten Inodes gehören, um sie auseinanderkopieren zu können. Für das Szenario sind DVDs doch von vornherein irrelevant.
Allerdings beisst du dir mit dem Argument grosser Zahlen selber in den Hintern, denn gerade bei n=100.000 wird der Unterschied zwischen O(n) und O(n log n) schon deutlich spürbar...
Ausserdem verstehe ich nicht, was du von DVDs faselst; die Problemstellung ist, dass du herausfinden möchtest, welche Hardlinks zu welchen merfach verlinkten Inodes gehören, um sie auseinanderkopieren zu können. Für das Szenario sind DVDs doch von vornherein irrelevant.