Tiếng Việt

Công cụ dành cho nhà phát triển · So sánh văn bản

Cách khác biệt văn bản tìm thấy các dòng đã thay đổi: LCS và thuật toán Myers

· Cách thức hoạt động

text-diff thuật toán developer-workflow

Hai chuỗi dòng được nối với nhau bằng một đường dẫn qua các mục phù hợp của chúng
Hình minh họa vector ToolAcre gốc

Giải thích ý tưởng về chuỗi con chung dài nhất đằng sau việc so sánh dựa trên dòng và lý do thuật toán Myers khiến nó đủ nhanh để chạy ngay lập tức, ngay cả trong tab trình duyệt.

Hai tệp, một câu hỏi: dòng nào còn tồn tại? — so sánh khung bằng cách tìm dòng dài nhất chung cho cả hai phiên bản thay vì khớp số dòng

Hai bản sửa đổi không có nhãn cho biết dòng nào còn tồn tại. ToolAcre trước tiên chia từng văn bản thành một danh sách có thứ tự, sau đó tìm kiếm một chuỗi dài xuất hiện trong cả hai danh sách theo cùng một thứ tự. Các đường bên ngoài cột sống chung đó trở thành những phần bổ sung hoặc loại bỏ hơn là những sửa đổi được đoán trước.

Kết quả mang vị trí dựa trên một ban đầu cho cả hai bên. Một hàng không thay đổi có một số ở mỗi bên, chỉ có phép loại bỏ ở bên trái và chỉ có phép cộng ở bên phải. Cách tính toán đó làm cho câu chuyện được hiển thị có thể xem lại được ngay cả khi các dòng lặp lại đưa ra nhiều hơn một sự liên kết hợp lý.

Tại sao khác biệt hoạt động trên dòng chứ không phải ký tự - cách phân tách trên dòng mới biến văn bản thành một chuỗi các đơn vị có thể so sánh được và tại sao điều đó làm cho văn xuôi hoạt động khác với mã

Việc triển khai coi một dòng hoàn chỉnh là đơn vị so sánh của nó. Do đó, ranh giới dòng mới định hình kết quả: chỉnh sửa một từ bên trong một đoạn được lưu trữ trên một dòng sẽ thay thế toàn bộ dòng đó, trong khi cùng một văn xuôi được sắp xếp từng câu có thể tách biệt một vùng nhỏ hơn nhiều.

So sánh dòng không phải là phân tích ký tự ẩn đằng sau một màn hình khác. `splitLines` tạo mảng và bảng LCS so sánh khóa dòng này với khóa dòng khác. Độ chi tiết có thể dự đoán được này phù hợp với các tệp nguồn và cấu hình, nhưng nó không thể làm nổi bật các chữ cái chính xác đã thay đổi bên trong một bản thay thế có giao diện phù hợp.

Dãy con chung dài nhất theo thuật ngữ đơn giản — trình bày ý tưởng LCS trên một ví dụ năm dòng và cho thấy mọi thứ bên ngoài dãy con trở thành một phần chèn hoặc xóa như thế nào

Tưởng tượng các dòng bên trái A, B, C, D, E và các dòng bên phải A, C, E. A, C và E tạo thành một dãy con chung có thứ tự. B và D nằm ngoài nó, do đó kết quả báo cáo hai hàng bị xóa và ba hàng không thay đổi mà không cần ghép dòng bị loại bỏ với một dòng thay thế.

Bảng ghi lại, đối với mỗi cặp vị trí còn lại, độ dài được chia sẻ tốt nhất có sẵn từ đó. Quá trình tái thiết tiến tới thông qua những giá trị đó. Các phím bằng nhau tiến lên cả hai bên; mặt khác, giá trị lân cận lớn hơn sẽ quyết định nên thực hiện phép cộng bên trái hay phép cộng bên phải.

Thuật toán Myers và lý do tốc độ lại quan trọng — giải thích, không cần công thức, cách truy tìm tập lệnh chỉnh sửa ngắn nhất giúp so sánh nhanh trên các tệp có hàng nghìn dòng

Sổ làm việc có tên Myers, nhưng `diff.js` triển khai rõ ràng lập trình động chuỗi dài nhất chung sau đó. Nhận xét của nó nêu rõ thời gian và bộ nhớ O(n·m) cho phần giữa khác nhau. Việc xác nhận quyền sở hữu Myers hoặc hành vi biểu đồ chỉnh sửa ngắn nhất sẽ thay thế một thuật toán quen thuộc cho mã thực sự được gửi.

ToolAcre giới hạn chi phí đó trước khi phân bổ. Các tiền tố và hậu tố bằng nhau được loại bỏ theo các đường tuyến tính và phần giữa khác nhau có thể chứa tối đa 2,000 dòng. Ma trận là `Uint32Array`; hình vuông được phép tồi tệ nhất được ghi lại chiếm khoảng 16 megabyte thay vì các giá trị được đóng hộp không giới hạn.

ToolAcre sử dụng bảng LCS chứ không phải thuật toán Myers có tên trong đề cương

So sánh nhật ký thay đổi có chứa “Tìm kiếm đã thêm”, “Xuất cố định” và “Trợ giúp được cập nhật” với bản sửa đổi giữ mục nhập đầu tiên và thứ ba nhưng chèn “Bộ lọc đã thêm” trước mục cuối cùng. Các mục nhập phổ biến cố định đường dẫn, "Xuất cố định" bị xóa và "Bộ lọc đã thêm" được thêm vào.

Thuật toán không gọi cặp đó là một dòng được sửa đổi. Từ vựng hàng của nó chỉ bằng nhau, thêm và bớt, do đó, việc thay thế văn bản sẽ xuất hiện dưới dạng một lần xóa, sau đó là một lần thêm. Bản tóm tắt tính các thao tác đó một cách riêng biệt và chỉ đánh dấu các văn bản giống hệt nhau khi cả hai số đếm đều bằng 0.

Tại sao hai khác biệt chính xác có thể trông khác nhau - cho thấy mối liên hệ giữa các tập lệnh chỉnh sửa ngắn như nhau giải thích lý do tại sao một công cụ đổ lỗi cho dòng trống và một công cụ khác đổ lỗi cho dấu ngoặc đóng

Các dòng lặp đi lặp lại hoặc có thể hoán đổi cho nhau có thể tạo ra một số chuỗi con chung có cùng độ dài. ToolAcre giải quyết một mối ràng buộc bằng cách ưu tiên loại bỏ khi hai giá trị của bảng lân cận bằng nhau. Một cách triển khai đúng khác có thể chọn phần bổ sung trước và thể hiện sự liên kết có giao diện khác với cùng chi phí chỉnh sửa.

Đó là lý do tại sao một dòng trống hoặc dấu ngoặc đóng có thể xuất hiện gắn liền với một phần khác trên các công cụ. Sự khác biệt không tự động có nghĩa là nội dung so sánh bị mất. Đọc số dòng ban đầu và các hàng không thay đổi xung quanh trước khi coi những khác biệt trong cách trình bày là những tuyên bố thực tế mang tính cạnh tranh.

Điều này không bao gồm những gì - so sánh ngữ nghĩa hoặc cấu trúc, phát hiện di chuyển và đánh dấu cấp độ từ nằm ngoài những gì tính toán khác biệt dựa trên dòng

Không có gì trong đường dẫn này phân tích cú pháp cây cú pháp, nhận dạng các mã định danh đã được đổi tên, gắn nhãn các khối đã di chuyển hoặc hiểu ý nghĩa văn xuôi. Đoạn đã di chuyển vi phạm yêu cầu về trật tự chung và có thể xuất hiện một lần khi bị xóa và một lần khi được thêm vào. Công cụ này cũng không tính toán các điểm nổi bật ở cấp độ ký tự hoặc từ bên trong các hàng.

Những thiếu sót đó là ranh giới chứ không phải chế độ ẩn. Sử dụng trình đánh giá nhận biết ngôn ngữ để xác nhận quyền sở hữu ngữ nghĩa và kiểm soát phiên bản đối với lịch sử hợp nhất. Sự khác biệt của văn bản trả lời câu hỏi hẹp hơn về việc hai chuỗi dòng có thứ tự khác nhau như thế nào, sau đó cho phép con người giải thích xem những chỉnh sửa văn bản đó có quan trọng hay không.

Bài học rút ra: ý nghĩa thực sự của các dòng được đánh dấu — tóm tắt cách đọc khác biệt một dòng dưới dạng câu chuyện chỉnh sửa ngắn nhất và cách tính năng so sánh Văn bản của ToolAcre chạy tính năng này trong tab của bạn mà không cần tải lên bất kỳ nội dung nào

Đọc các hàng màu xanh lá cây và màu đỏ dưới dạng lời giải thích bắt nguồn từ LCS chứ không phải dưới dạng bằng chứng cho ý định của tác giả. Việc cắt bỏ tiền tố và hậu tố làm thay đổi khối lượng công việc nhưng không thay đổi cách tính dòng cuối cùng. Văn bản gốc vẫn còn ở mỗi hàng ngay cả khi các tùy chọn viết hoa hoặc khoảng trắng cung cấp các phím lỏng lẻo hơn để khớp.

Việc so sánh được thực hiện thông qua các mô-đun trình duyệt đã nhập và hiển thị với các nút văn bản DOM; không có điểm cuối chuyển đổi trong đường dẫn dao. Hãy thử một ví dụ gồm năm dòng, hoán đổi các bên và tải xuống đầu ra có hình bản vá để xem hướng thay đổi các phần bổ sung thành phần xóa mà không phát minh ra ngữ nghĩa.