2012-11-18 30 views
8

thể trùng lặp:
Is there a way to diff files from C++?Thư viện Linux C hoặc C++ cho các chuỗi khác biệt và vá?

tôi có các chuỗi văn bản dài mà tôi muốn diff và vá. Điều đó được cung cấp cho chuỗi a và b:

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

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

assert(a == a2); 

Nếu có thể đọc được con người là tiền thưởng.

Một cách để thực hiện việc này là sử dụng system(3) để gọi các lệnh gọi diffpatch trình bao từ diffutils và đặt chúng vào các chuỗi. Một cách khác sẽ được thực hiện các chức năng bản thân mình (tôi đã suy nghĩ xử lý mỗi dòng nguyên tử và sử dụng thuật toán chỉnh sửa tiêu chuẩn khoảng cách n^3 linewise với backtracking).

Tôi đã tự hỏi liệu có ai biết thư viện Linux C hoặc C++ tốt sẽ thực hiện công việc trong quá trình không?

+0

liên kết này có hữu ích không? http://www.codeproject.com/Articles/3666/Diff-tool – billz

+1

Nếu bạn có thể nhúng Python vào ứng dụng của mình, [this] (http://docs.python.org/2/library/difflib.html) sẽ có ích. – user4815162342

Trả lời

6

Bạn có thể triển khai google thuật toán Myers Diff. ("Thuật toán khác biệt của An O (ND) và các biến thể của nó") hoặc các thư viện giải quyết vấn đề "Hậu quả chung nhất". Theo như tôi biết, tình huống có diff/patch trong C++ không tốt - có một số thư viện (bao gồm diff match patch, libmba), nhưng theo kinh nghiệm của tôi, chúng có phần kém tài liệu hoặc có phần nặng bên ngoài phụ thuộc (bản vá phù hợp với yêu cầu Qt 4, ví dụ) hoặc chuyên về loại bạn không cần (std :: string khi bạn cần unicode, ví dụ) hoặc không đủ chung chung hoặc sử dụng thuật toán chung có rất yêu cầu bộ nhớ cao ((M + N)^2 trong đó M và N là độ dài của chuỗi đầu vào).

Bạn cũng có thể tự mình thực hiện các yêu cầu bộ nhớ thuật toán Myers (N + M), nhưng giải pháp của vấn đề là cực kỳ khó hiểu - mong đợi lãng phí ít nhất một tài liệu đọc tuần. Lời giải thích có thể đọc được của con người về thuật toán Myers có sẵn here.

+0

Tôi đã đọc bản gốc tối qua: http://www.xmailserver.org/diff2.pdf. Nó khá đơn giản nếu bạn biết thuật toán khoảng cách chỉnh sửa đầu tiên.Về cơ bản thay vì tìm kiếm toàn bộ biểu đồ chỉnh sửa, nó tìm kiếm đường dẫn có những thay đổi tối thiểu trước tiên và ghi nhớ kết quả cho lần lặp tiếp theo, mở rộng chúng bằng một thay đổi mỗi lần. Vì vậy, một khi nó tìm thấy điểm cuối nó sẽ là một giải pháp với những thay đổi tối thiểu, và nó sẽ chỉ tìm kiếm các giải pháp tốt hơn có thể trước tiên. Một trường hợp cụ thể của thuật toán tìm kiếm đầu tiên tốt nhất ('A *'). –

+0

@ AndrewTomazos-Fathomling: Nó không đơn giản. Ví dụ, nó là vô cùng khó khăn để nói những gì chính xác được gọi là "con rắn trung". Tất nhiên, nó có thể đơn giản cho những người có nền tảng toán học. – SigTerm

+0

Sự tinh lọc "rắn trung" là một phần mở rộng cho thuật toán cơ bản. Nó chỉ có nghĩa là đồng thời tiến hành tìm kiếm từ trên cùng bên trái đến dưới cùng bên phải và ngược lại. Khi hai tìm kiếm gặp nhau, bạn có một giải pháp. Bạn có thể loại bỏ thông tin đường dẫn ngược và sử dụng thuật toán kép này lặp lại như một phép đệ quy phân chia và tìm kiếm nhị phân để mặc dù nó sẽ mất nhiều thời gian hơn, bạn chỉ cần không gian tuyến tính (nếu không gian là cao cấp). –

2

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

Các trận đấu Diff và thư viện vá cung cấp các thuật toán mạnh mẽ để thực hiện các hoạt động cần thiết để đồng bộ hóa văn bản đơn giản .

Hiện có sẵn trong Java, JavaScript, Dart, C++, C#, Mục tiêu C, Lua và Python. Bất kể ngôn ngữ, mỗi thư viện đều có cùng API và cùng chức năng. Tất cả các phiên bản cũng có khai thác thử nghiệm toàn diện.

Các vấn đề liên quan