Szukałem szalonego wyjaśnienia algorytmu różnicowania, który działa i jest wydajny.
Najbliższy mi jest ten link do RFC 3284 (z kilku postów na blogu Erica Sinka), który opisuje w zrozumiały sposób format danych, w których przechowywane są wyniki różnic. Jednak nie ma żadnej wzmianki o tym, jak program osiągnąłby te wyniki podczas wykonywania różnicy.
Próbuję to zbadać z osobistej ciekawości, ponieważ jestem pewien, że przy implementacji algorytmu różnicowania muszą istnieć kompromisy, które są dość jasne czasami, gdy patrzysz na różnice i zastanawiasz się "dlaczego program porównujący wybrał to jako zmianę zamiast tego?"...
Gdzie mogę znaleźć opis wydajnego algorytmu, który wyprowadziłby VCDIFF?
Nawiasem mówiąc, jeśli zdarzy ci się znaleźć opis rzeczywistego algorytmu używanego przez SourceGear's DiffMerge, byłoby jeszcze lepiej.
UWAGA: najdłuższy wspólny podciąg nie wydaje się być algorytmem używanym przez VCDIFF, wygląda na to, że robią coś mądrzejszego, biorąc pod uwagę format danych, którego używają.
Odpowiedzi:
Algorytm różnicy O (ND) i jego wariacje to fantastyczny artykuł i możesz zacząć od tego. Zawiera pseudokod i ładną wizualizację przechodzenia przez wykresy związane z wykonywaniem różnic.
Rozdział 4 artykułu wprowadza pewne udoskonalenia algorytmu, dzięki którym jest on bardzo skuteczny.
Pomyślne wdrożenie tego zapewni Ci bardzo przydatne narzędzie w zestawie narzędzi (i prawdopodobnie również doskonałe doświadczenie).
Wygenerowanie potrzebnego formatu wyjściowego może czasami być trudne, ale jeśli rozumiesz funkcje wewnętrzne algorytmu, powinieneś być w stanie wydrukować wszystko, czego potrzebujesz. Możesz także wprowadzić heurystykę, aby wpłynąć na wynik i dokonać pewnych kompromisów.
Oto strona, która zawiera trochę dokumentacji, pełny kod źródłowy i przykłady algorytmu diff przy użyciu technik z wyżej wymienionego algorytmu.
Wydaje się, że kod źródłowy jest zgodny z podstawowym algorytmem i jest łatwy do odczytania.
Jest też trochę na temat przygotowania danych wejściowych, które mogą okazać się przydatne. Istnieje ogromna różnica w wynikach, gdy porównujesz znak lub znacznik (słowo).
Powodzenia!
źródło
diff
publikacji uniksowej autorstwa Hunta i McIlroya.Chciałbym zacząć od spojrzenia na rzeczywisty kod źródłowy dla GNU diff, co sprawia, że dostępne .
Aby zrozumieć, jak faktycznie działa ten kod źródłowy, dokumenty w tym pakiecie odnoszą się do artykułów, które go zainspirowały:
Przeczytanie artykułów, a następnie przyjrzenie się kodowi źródłowemu implementacji powinno wystarczyć, aby zrozumieć, jak to działa.
źródło
Zobacz https://github.com/google/diff-match-patch
Zobacz także stronę różnic w wikipedia.org i - „ Bram Cohen: Problem z różnicami został rozwiązany ”
źródło
Przyjechałem tutaj, szukając algorytmu diff, a następnie wykonałem własną implementację. Przepraszam, nie wiem o vcdiff.
Wikipedia : Z najdłuższego wspólnego podciągu wystarczy mały krok, aby uzyskać wynik podobny do diff: jeśli element jest nieobecny w podciągu, ale występuje w oryginale, musiał zostać usunięty. (Znaki „-” poniżej.) Jeśli nie ma go w podciągu, ale występuje w drugiej sekwencji, musi zostać dodany. (Znaki „+”).
Ładna animacja algorytmu LCS tutaj .
Link do szybkiej implementacji LCS w języku Ruby tutaj .
Moja powolna i prosta adaptacja rubinowa jest poniżej.
źródło
Opierając się na linku podanym przez Emmelaicha, na stronie Neila Frasera (jednego z autorów biblioteki) znajduje się również obszerny przegląd Diff Strategies .
Omawia podstawowe strategie i pod koniec artykułu przechodzi do algorytmu Myera i pewnej teorii grafów.
źródło