10
votes

Bibliothèque Linux C ou C ++ sur DIFF et Cordes de correctifs?

Duplicaté possible:

est là un moyen de différer des fichiers de C ++?

J'ai de longues chaînes de texte que je souhaite différer et patch. Qui est donnée des chaînes A et B: xxx

si a_diff_b était lisible humain qui serait un bonus.

Pour mettre en œuvre ce serait d'utiliser System (3) pour appeler le DIFF et des commandes de coquille de diffutils et turez-les les cordes. Une autre façon serait de mettre en œuvre les fonctions moi-même (je pensais traiter chaque ligne atomiquement et utiliser la distance d'édition standard n ^ 3 algorithme dans le sens de l'arrière-plan).

Je me demandais si quelqu'un sait un bon linux c ou bibliothèque C ++ qui ferait le travail en cours de traitement?


3 commentaires

Ce lien sera-t-il utile? CODEPROJECT.COM/Articles/3666/diff-tool


Si vous pouvez incorporer Python dans votre application, Ce sera utile.


Consultez cette option: XMailServer.org/xdiff-lib.html


3 Réponses :


8
votes

Je crois que

https://github.com/cubicdaiya/dtl/wiki/Tutorial < / p>

Peut avoir ce dont vous avez besoin


0 commentaires

3
votes

http://code.google.com/p/google- Diff-match-patch /

Les bibliothèques de correspondance et de correction DIFF offrent des algorithmes robustes pour effectuer les opérations requises pour la synchronisation du texte brut.

Actuellement disponible en Java, JavaScript, Dart, C ++, C #, Objectif C, Lua et Python. Indépendamment de la langue, chaque bibliothèque présente la même API et la même fonctionnalité. Toutes les versions ont également des harnais de test complets.


0 commentaires

9
votes

Vous pouvez mettre en œuvre Google de Myers DIFF ALGORITHM. ("Un algorithme de différence" O (ND) et ses variations ") ou des bibliothèques qui résolvent le problème" le plus long de la recherche courante ".

Autant que je sache, la situation avec diff / patch en C ++ n'est pas bonne - il existe plusieurs bibliothèques (y compris DIFF correspondant patch , libmb- ), mais selon mon expérience, ils sont quelque peu mal documentés ou ont des dépendances externes lourdes (le patch de correspondance DIFF nécessite que Qt 4, par exemple) ou sont spécialisés sur le type dont vous n'avez pas besoin (STD :: String lorsque vous avez besoin d'unicode, par exemple), ou ne sont pas suffisamment génériques ou n'utilisent pas d'algorithme générique qui a des exigences de mémoire très élevées ((M + N) ^ 2 où m et n sont des longueurs de séquences d'entrée).

Vous pouvez également essayer d'implémenter vous-même des exigences de myers Algorithme ((N + M)), mais la solution de problème est extrêmement difficile à comprendre - attendez-vous au moins une documentation de lecture de semaine. Une explication quelque peu lisible par l'homme d'algorithme de Myers est disponible ici .


5 commentaires

J'ai lu le papier d'origine hier soir: XMAailServer.org/diff2.pdf . C'est assez simple si vous connaissez d'abord l'algorithme de distance d'édition. Fondamentalement plutôt que de rechercher l'ensemble du graphe d'édition, il recherche le chemin d'abord avec les modifications minimales, et indique les résultats de la prochaine itération, en les prolongeant par un changement à chaque fois. Ainsi, une fois qu'il trouve le point final, il s'agira d'une solution avec des changements minimes et il n'aura que rechercher de meilleures solutions possibles. C'est un cas spécifique d'un meilleur algorithme de recherche ( a * ).


@ Andrewtomazos-Fathomling: Ce n'est pas simple. Par exemple, il est extrêmement difficile de dire ce qu'on appelle exactement "serpent moyen". Bien sûr, cela pourrait être simple pour les personnes ayant des antécédents mathématiques.


Le raffinement de «serpent moyen» est une extension de l'algorithme de base. Cela signifie simplement une recherche simultanée de la part du haut à gauche en bas à droite et visa-versa. Lorsque les deux recherches se rencontrent, vous avez une solution. Vous pouvez supprimer des informations de chemin de retour en arrière et utiliser cette double algorithme à plusieurs reprises sous la forme d'une récursion de la division "Binary Recherche" de manière à ce que, bien que cela ne soit plus logarithmiquement plus de temps, il suffit d'un espace linéaire (si l'espace est à une prime).


Le "serpent moyen" n'est pas un raffinement. Il est au cœur de l'algorithme de Myers. J'ai écrit libmbba et la mise en œuvre du diff n'a pas de dépendances externes (il n'utilise qu'un autre module du paquet libmba afin que vous puissiez l'isoler complètement en modifiant le maquillage) et c'est maigre. Je me rends compte que c'est amusant de mettre en œuvre des choses comme celles-ci vous-même et ce serait un excellent exercice de programmation, mais vous allez être difficile de trouver quelque chose de mieux.


En ce qui concerne l'algorithme des myers, j'ai mis en œuvre une bibliothèque C / C ++ légère ( Github.com/martinsos/edlib ) Sur son article ultérieur, où il décrit un algorithme de vecteur de bit pour calculer la distance d'édition. Il n'est certainement pas trivial de mettre en œuvre, surtout si vous voulez que ce soit rapide. Il renvoie également "serpent moyen" comme vous l'appelez (j'appelle le chemin d'alignement informatique).