Chuỗi con dài nhất trong thời gian tuyến tính


Câu trả lời:


14

Để cho mn là độ dài của hai chuỗi đã cho,

Thời gian tuyến tính giả sử kích thước của bảng chữ cái là không đổi.

Có, chuỗi con chung dài nhất của hai chuỗi đã cho có thể được tìm thấy trong O(m+n) thời gian, giả sử kích thước của bảng chữ cái là không đổi.

Dưới đây là một đoạn trích từ bài viết trên Wikipedia về vấn đề chuỗi con phổ biến dài nhất .

Các chuỗi con chung dài nhất của một chuỗi các chuỗi có thể được tìm thấy bằng cách xây dựng một cây hậu tố tổng quát cho các chuỗi, và sau đó tìm các nút bên trong sâu nhất có các nút lá từ tất cả các chuỗi trong cây con bên dưới nó.

Xây dựng một cây hậu tố tổng quát cho hai chuỗi đã choO(m+n)thời gian sử dụng thuật toán Ukkonen nổi tiếng khéo léo . Tìm các nút nội bộ sâu nhất đến từ cả hai chuỗiO(m+n)thời gian. Do đó chúng ta có thể tìm thấy chuỗi con chung dài nhất trongO(m+n) thời gian.

Để triển khai công việc, vui lòng xem qua Ứng dụng Suffix Tree 5 - Chuỗi con chung dài nhất tại GeekforGeek

(Cải thiện!) Thời gian tuyến tính

Trong thực tế, chuỗi con chung dài nhất của hai chuỗi đã cho có thể được tìm thấy trong O(m+n) thời gian bất kể kích thước của bảng chữ cái.

Dưới đây là bản tóm tắt về tính toán các nền tảng phổ biến dài nhất qua Suffix Mảng của Babenko, Maxim & Starikovskaya, Tatiana. (2008).

Cho một bộ N dây A={α1,,αN} tổng chiều dài n trên bảng chữ cái Σ người ta có thể yêu cầu tìm, cho mỗi 2kN, chuỗi con dài nhất β ít nhất xuất hiện K chuỗi trong Một. Được biết, vấn đề này có thể được giải quyết trongÔi(n)thời gian với sự giúp đỡ của cây hậu tố. Tuy nhiên, thuật toán kết quả khá phức tạp (đặc biệt, nó liên quan đến việc trả lời một số truy vấn tổ tiên ít phổ biến nhất trongÔi(1)thời gian). Ngoài ra, thời gian chạy và tiêu thụ bộ nhớ của nó có thể phụ thuộc vào|Σ|.

Bài viết này trình bày một cách tiếp cận khác, đơn giản đáng chú ý cho vấn đề trên, dựa trên khái niệm mảng hậu tố. Khi mảng hậu tố của một số phụ trợÔi(n)chuỗi -length được tính toán, người ta cần một đơn giản Ôi(n)thời gian hậu xử lý để tìm chuỗi con dài nhất được yêu cầu. Do một số thuật toán thời gian tuyến tính hiệu quả và đơn giản để xây dựng các mảng hậu tố đã được phát triển gần đây (với hằng số không phụ thuộc vào|Σ|), cách tiếp cận của chúng tôi có vẻ khá thực tế.

Dưới đây là ý tưởng chung của thuật toán trong bài báo trên. Hãy để chuỗiα được kết nối của tất cả αTôivới các Sentinels riêng biệt. Xây dựng mảng hậu tố choαcũng như mảng tiền tố phổ biến dài nhất của nó . Áp dụng một kỹ thuật cửa sổ trượt cho các mảng này để có được các chuỗi con dài nhất.


4

Đúng. Thậm chí còn có một bài viết Wikipedia về nó! https://en.wikipedia.org/wiki/Longest_common_subopes_propet

Cụ thể, như Wikipedia giải thích, có một thuật toán thời gian tuyến tính, sử dụng các cây hậu tố (hoặc mảng hậu tố).

Tìm kiếm trên "chuỗi con chung dài nhất" sẽ hiển thị bài viết Wikipedia đó là lần truy cập đầu tiên (đối với tôi). Trong tương lai, xin vui lòng nghiên cứu vấn đề trước khi hỏi ở đây. (Xem, ví dụ: https://meta.stackoverflow.com/q/261592/781723 .)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.