Ich habe nach einer Erklärung für einen Diff-Algorithmus gesucht, der funktioniert und effizient ist.
Das nächste, was ich bekommen habe, ist dieser Link zu RFC 3284 (aus mehreren Eric Sink-Blog-Posts), der in verständlichen Begriffen das Datenformat beschreibt, in dem die Diff-Ergebnisse gespeichert sind. Es wird jedoch überhaupt nicht erwähnt, wie ein Programm diese Ergebnisse erzielen würde, wenn es einen Unterschied macht.
Ich versuche dies aus persönlicher Neugier zu untersuchen, weil ich sicher bin, dass es bei der Implementierung eines Diff-Algorithmus Kompromisse geben muss, die manchmal ziemlich klar sind, wenn man sich Unterschiede ansieht und sich fragt, warum das Diff-Programm dies als Änderung gewählt hat stattdessen?"...
Wo finde ich eine Beschreibung eines effizienten Algorithmus, der am Ende VCDIFF ausgeben würde?
Übrigens, wenn Sie zufällig eine Beschreibung des tatsächlichen Algorithmus finden, der von SourceGears DiffMerge verwendet wird, wäre das sogar noch besser.
HINWEIS: Die längste gemeinsame Teilsequenz scheint nicht der von VCDIFF verwendete Algorithmus zu sein. Angesichts des von ihnen verwendeten Datenformats scheinen sie etwas Klügeres zu tun.
Antworten:
Ein O (ND) -Differenzalgorithmus und seine Variationen sind eine fantastische Arbeit, und Sie können dort beginnen. Es enthält Pseudocode und eine schöne Visualisierung der Graphendurchläufe, die beim Ausführen des Diff beteiligt sind.
In Abschnitt 4 des Papiers werden einige Verfeinerungen des Algorithmus vorgestellt, die ihn sehr effektiv machen.
Wenn Sie dies erfolgreich implementieren, erhalten Sie ein sehr nützliches Tool in Ihrer Toolbox (und wahrscheinlich auch einige hervorragende Erfahrungen).
Das Generieren des von Ihnen benötigten Ausgabeformats kann manchmal schwierig sein. Wenn Sie jedoch die Interna des Algorithmus verstehen, sollten Sie in der Lage sein, alles auszugeben, was Sie benötigen. Sie können auch Heuristiken einführen, um die Ausgabe zu beeinflussen und bestimmte Kompromisse einzugehen.
Hier ist eine Seite , die ein wenig Dokumentation, vollständigen Quellcode und Beispiele eines Diff-Algorithmus enthält, der die Techniken des oben genannten Algorithmus verwendet.
Der Quellcode scheint dem grundlegenden Algorithmus genau zu folgen und ist leicht zu lesen.
Es gibt auch ein bisschen über die Vorbereitung der Eingabe, was Sie vielleicht nützlich finden. Es gibt einen großen Unterschied in der Ausgabe, wenn Sie sich nach Zeichen oder Token (Wort) unterscheiden.
Viel Glück!
quelle
diff
von Hunt und McIlroy.Ich würde zunächst den tatsächlichen Quellcode für diff betrachten, den GNU zur Verfügung stellt .
Um zu verstehen, wie dieser Quellcode tatsächlich funktioniert, verweisen die Dokumente in diesem Paket auf die Papiere, die ihn inspiriert haben:
Das Lesen der Papiere und das Betrachten des Quellcodes für eine Implementierung sollte mehr als genug sein, um zu verstehen, wie es funktioniert.
quelle
Siehe https://github.com/google/diff-match-patch
Siehe auch die Diff-Seite von wikipedia.org und - " Bram Cohen: Das Diff-Problem wurde gelöst "
quelle
Ich bin hierher gekommen, um nach dem Diff-Algorithmus zu suchen, und habe danach meine eigene Implementierung vorgenommen. Entschuldigung, ich weiß nichts über vcdiff.
Wikipedia : Von einer längsten gemeinsamen Teilsequenz ist es nur ein kleiner Schritt, eine diff-ähnliche Ausgabe zu erhalten: Wenn ein Element in der Teilsequenz fehlt, aber im Original vorhanden ist, muss es gelöscht worden sein. (Die '-' Markierungen unten.) Wenn es in der Teilsequenz fehlt, aber in der zweiten Sequenz vorhanden ist, muss es hinzugefügt worden sein. (Die '+' Markierungen.)
Schöne Animation des LCS-Algorithmus hier .
Link zu einer schnellen LCS Ruby-Implementierung hier .
Meine langsame und einfache Rubinanpassung ist unten.
quelle
Basierend auf dem Link, den Emmelaich gegeben hat, gibt es auch eine große Anzahl von Diff-Strategien auf Neil Frasers Website (einer der Autoren der Bibliothek). .
Er behandelt grundlegende Strategien und geht gegen Ende des Artikels zu Myers Algorithmus und einer Graphentheorie über.
quelle