2012-11-18 2 views
8

가능한 중복 :
Is there a way to diff files from C++?Linux C 또는 C++ 라이브러리에서 문자열을 비교 및 ​​패치 할 수 있습니까?

내가 diff를 패치 할 긴 텍스트 문자열을 가지고있다.

string a = ...; 
string b = ...; 

string a_diff_b = create_patch(a,b); 
string a2 = apply_patch(a_diff_b, b); 

assert(a == a2); 

a_diff_b 경우는 보너스 될 사람이 읽을 수 있었다 : 그 문자열을 a와 b가 주어집니다. 이를 구현하기 위해

한 가지 방법은 diffutils 및 파이프 그들에게 문자열에서 diffpatch 쉘 명령을 호출 할 system(3)을 사용하는 것입니다. 또 다른 방법은 함수를 직접 구현하는 것입니다. (저는 각 행을 원자 적으로 처리하고 표준 편집 거리 n^3 알고리즘을 역 추적과 함께 사용합니다).

누군가가 좋은 리눅스 C 또는 C++ 라이브러리를 알고 있는지 궁금합니다.

+0

이 링크가 도움이 되나요? http://www.codeproject.com/Articles/3666/Diff-tool – billz

+1

응용 프로그램에 파이썬을 내장 할 수 있다면 [this] (http://docs.python.org/2/library/difflib.html)는 도움이 되길. – user4815162342

답변

6

Google에서 Myers Diff 알고리즘을 구현할 수 있습니다. ("O (ND) 차이 알고리즘 및 그 변형") 또는 "Longest common subsequence"문제를 해결하는 라이브러리.

내가 아는 한 C++의 diff/patch 상황은 좋지 않습니다. -, libmba을 비롯한 몇 가지 라이브러리가 있지만 내 경험에 따르면 다소 문서화가 잘되어 있지 않거나 중량이 많은 외부 라이브러리가 있습니다. 의존성 (diff match patch는 예를 들어 Qt 4가 필요합니다.) 또는 필요하지 않은 유형 (예 : 유니 코드가 필요할 때 std :: string)에 특화되어 있거나 충분히 제네릭이 아니거나, 높은 메모리 요구 사항 ((M + N)^2 여기서 M과 N은 입력 시퀀스의 길이 임).

Myers 알고리즘 ((N + M) 메모리 요구 사항)을 직접 구현할 수도 있지만 문제의 해결 방법은 극도로 이해하기 어렵습니다. 설명서를 읽는 데 적어도 일주일은 낭비 할 것으로 예상됩니다. 사람이 읽을 수있는 Myers 알고리즘에 대한 설명은 here입니다.

+0

지난 밤 원본 문서 : http://www.xmailserver.org/diff2.pdf를 읽었습니다. 먼 거리 편집 알고리즘을 알고 있다면 그것은 매우 간단합니다.기본적으로 전체 편집 그래프를 검색하는 것이 아니라 최소 변경으로 경로를 검색하고 매번 한 번씩 변경하여 다음 반복의 결과를 메모합니다. 따라서 끝점을 찾으면 최소한의 변경 사항 만있는 솔루션이 될 것이고 더 좋은 솔루션을 먼저 검색 할 것입니다. 최고의 첫 번째 검색 알고리즘 ('A *')의 특별한 경우입니다. –

+0

@ AndrewTomazos-Fathomling : 그것은 간단하지 않습니다. 예를 들어, 정확하게 "중간 뱀"이라고 불리는 것을 말하기는 매우 어렵습니다. 물론, 수학적 배경을 가진 사람들에게는 쉽다. – SigTerm

+0

"middle snake"상세 검색은 기본 알고리즘을 확장 한 것입니다. 그것은 단지 왼쪽 상단에서 오른쪽 하단까지 검색과 동시에 검색을 동시에 수행하는 것을 의미합니다. 두 가지 검색 결과가 만났을 때 해결책이 있습니다. 역 추적 경로 정보를 무시하고이 이중 알고리즘을 "2 진 검색"분할 - 및 - 정복 재귀로 반복적으로 사용하여 대수적으로 더 많은 시간이 걸리지 만 선형 공간 만 필요합니다 (공간이 프리미엄 인 경우). –

2

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

은 diff 일치 및 패치 라이브러리 일반 텍스트를 동기화에 필요한 작업을 수행 할 수있는 강력한 알고리즘을 제공

.

현재 Java, JavaScript, Dart, C++, C#, Objective C, Lua 및 Python에서 사용할 수 있습니다. 언어에 관계없이 각 라이브러리는 동일한 API와 동일한 기능을 제공합니다. 모든 버전에는 포괄적 인 테스트 장치가 있습니다.