Câu hỏi Các thuật toán khác nhau của tài liệu hoạt động như thế nào?


Tôi muốn thực hiện tài liệu từ khác nhau, thuật toán nào cần phải thực hiện?


25
2017-10-02 15:21


gốc


Bạn sẽ sử dụng nó để chỉ sự khác biệt, hoặc cửa hàng sự khác biệt một cách tối ưu? - Lasse Vågsæther Karlsen


Các câu trả lời:


Giải pháp tối ưu nhất của lcs là O (ND) Thuật toán của Myer và đây là một cách tiếp cận thuật toán mà tôi đã sử dụng để triển khai các tài liệu văn phòng khác năm 2007. Liên kết đến giấy thuật toán


3
2017-10-03 17:34



liên kết giấy không hoạt động .. - Masud Rahman
Điều này đang làm việc cho tôi: xmailserver.org/diff2.pdf - Zamicol


Nói chung, diff'ing thường được giải quyết bởi Vấn đề hậu quả phổ biến lâu nhất. Xem thêm "Thuật toán " của bài viết trên Wikipedia về Khác biệt:

Hoạt động của diff được dựa trên   giải quyết các subsequence phổ biến dài nhất   vấn đề.

Trong vấn đề này, bạn có hai   chuỗi các mục:

   a b c d f g h j q z

   a b c d e f g i j k r x y z

và bạn muốn tìm lâu nhất   chuỗi các mục hiện diện trong   cả hai chuỗi gốc trong cùng một   gọi món. Đó là, bạn muốn tìm một cái mới   trình tự có thể lấy từ   chuỗi đầu tiên bằng cách xóa một số   các mục và từ chuỗi thứ hai   xóa các mục khác. Bạn cũng muốn   trình tự này miễn là   khả thi. Trong trường hợp này, nó là

   a b c d f g j z

Từ chuỗi phổ biến dài nhất   nó chỉ là một bước nhỏ để có được   đầu ra tương tự:

   e   h i   q   k r x y 
   +   - +   -   + + + +

Điều đó nói rằng, tất cả điều này hoạt động tốt với các văn bản dựa trên văn bản. Vì Tài liệu Word có hiệu quả ở định dạng nhị phân và bao gồm nhiều thông tin định dạng và dữ liệu, điều này sẽ phức tạp hơn nhiều. Lý tưởng nhất, bạn có thể xem xét tự động hoá chính Word vì nó có khả năng "khác biệt" giữa các tài liệu, như được mô tả chi tiết ở đây:

Microsoft Word Mẹo: Làm thế nào để so sánh hai tài liệu cho sự khác biệt


28
2017-10-02 15:30



Có hai mục đích để triển khai thuật toán khác: Chỉ lưu trữ sự khác biệt giữa các phiên bản hoặc để hiển thị sự khác biệt giữa các phiên bản. Đây là rất khác nhau (không có ý định chơi chữ). LCS thường chỉ có thể sử dụng để hiển thị sự khác biệt, nhưng để lưu trữ tối ưu, cần có nhiều thuật toán nâng cao hơn. Ví dụ, nếu bạn cắt một phần lớn từ một phần của tài liệu, và dán nó vào một phần khác, một thuật toán lưu trữ tốt sẽ phát hiện và không lưu trữ nó như "hey, rất nhiều dữ liệu mới xuất hiện ở đây". - Lasse Vågsæther Karlsen
@ Lasse - Đồng ý. Vì người hỏi câu hỏi ban đầu đang nói về các tài liệu Word, tôi cho rằng họ sẽ quan tâm hơn đến khía cạnh "trực quan" của sự khác biệt, thay vì bên lưu trữ. Tuy nhiên, bạn là chính xác trong đó cho phía lưu trữ, bạn sẽ được nhìn vào Delta Encoding / Compression (en.wikipedia.org/wiki/Delta_encoding) v.v. - CraigTP


Một khác biệt cơ bản là một giải pháp đến vấn đề thứ bậc phổ biến dài nhất.

Giải pháp tối ưu đòi hỏi kiến ​​thức về lập trình năng động vì vậy nó là một vấn đề khá phức tạp để giải quyết.

Tuy nhiên, nó cũng có thể được thực hiện bằng cách xây dựng một cây hậu tố. Cả hai thuật toán đều được vạch ra đây.


15
2017-10-02 15:24



Nói chung, khi bạn giả định tài liệu của mình là luồng ký tự hoặc byte. Tuy nhiên, đây là câu hỏi về tài liệu từ. Trước khi thực hiện một thuật toán như vậy, bạn cần phải tự hỏi mình một câu hỏi là 'Hello World' trong màu xanh 8pt Verdana giống như 'Hello World' trong màu đỏ 10pt Arial, v.v. - quosoo
Có, rõ ràng các thuật toán cơ bản sẽ yêu cầu thêm logic để phân tích cú pháp cho những khác biệt như vậy, nhưng cốt lõi của thuật toán sẽ vẫn như cũ. - Ben S


Xem Thuật toán chênh lệch O (ND) cho C #.


6
2017-10-02 15:24





Như Ben S đã chỉ ra, vấn đề khác biệt có thể được giải quyết thông thường bằng cách giải quyết vấn đề thứ bậc phổ biến dài nhất. Cụ thể hơn, The Thuật toán Hunt-McIlroy là một trong những thuật toán cổ điển đã được áp dụng cho vấn đề (ví dụ: trong việc triển khai Unix ' khác biệt tiện ích).


2
2017-10-02 15:28