Tìm kiếm lặp lại dài nhất


9

Đưa ra một chuỗi , tôi muốn tìm chuỗi lặp lại dài nhất (ít nhất hai lần). Đó là, tôi muốn tìm một chuỗi w mà là một dãy (không nhất thiết phải là một tiếp giáp) của sw = w 'w ' . Đó là, w là một chuỗi có một nửa xuất hiện hai lần liên tiếp. Lưu ý rằng w là một chuỗi con của s , nhưng không nhất thiết phải là một chuỗi con.swsw=wwwws

Ví dụ:

Đối với 'ababccabdc', nó sẽ là 'abcabc', vì 'abc' = 'abc' và 'abc' xuất hiện (ít nhất) hai lần trong 'ababccabdc'.

Đối với 'addbacddabcd', một tùy chọn là 'dddd' vì 'dd' xuất hiện hai lần (tôi không thể sử dụng cùng một chữ cái nhiều lần, nhưng ở đây tôi có 4 'd' nên nó ổn), nhưng nó có thể là một cái tốt hơn 4. Tôi có thể tìm thấy một cái tốt hơn có độ dài 8: 'abcdabcd', vì 'abcd' là một chuỗi con của 'addbacddabcd' xuất hiện hai lần.

Tôi quan tâm đến việc tìm kiếm sự lặp lại dài nhất. Điều này cũng được gọi là "tìm hình vuông dài nhất / lớn nhất", nhưng tôi đã đọc nhiều bài viết trong đó một hình vuông được xác định cho một chuỗi con và không phải là một chuỗi con.

Tôi có thể dễ dàng sử dụng thuật toán brute force sẽ lấy O(n3) bằng cách lặp trên tất cả các tùy chọn cho một điểm dừng trong chuỗi, và sau đó tôi sẽ có hai chuỗi trong đó tôi sẽ tìm kiếm chuỗi chung lớn nhất / dài nhất, nhưng mỗi kiểm tra sẽ lấy O(n2) bằng kỹ thuật lập trình động, do đó toàn bộ thời gian sẽ là O(n3) . Tôi đã tìm thấy một thuật toán hiệu quả hơn cho chuỗi con chung dài nhất mất O(n2logn), vì vậy thời gian chạy sẽ làO(n3logn).

Tôi đang tìm kiếm một thuật toán hiệu quả hơn cho bài toán lặp lại dài nhất. Có lẽ ý tưởng của tôi về việc lặp lại trên tất cả các điểm dừng lãng phí quá nhiều thời gian và có thể được giảm xuống thành các lần lặp ít hơn. Hoặc có lẽ một thuật toán với một thái độ khác nhau có thể giải quyết vấn đề này.

Tôi đã tìm kiếm trong nhiều tạp chí và các câu hỏi trước đó, và hầu hết các kết quả tôi tìm thấy là về một chuỗi con chứ không phải về một chuỗi.

Tôi cũng đã đọc rằng điều này có thể được thực hiện bằng cách sử dụng cây hậu tố, nhưng điều này cũng có liên quan đến các chuỗi con và tôi không chắc liệu ý tưởng đó có thể được mở rộng cho lần sau hay không.

Tôi đang tìm kiếm một giải pháp chạy trong thời gian . Nếu tồn tại một trong thời gian O ( n log n ) sẽ còn tốt hơn nữa (tôi không chắc có tồn tại như vậy không).O(n2)O(nlogn)


4
Tra cứu cây hậu tố hoặc mảng hậu tố.
Bút danh

1
Nó rất không chắc rằng một -time thuật toán tồn tại cho vấn đề này, vì nếu nó đã làm, bạn có thể sử dụng nó để đánh bại các thuật toán nổi tiếng nhất cho việc tìm kiếm các LCS của hai length- n chuỗi uv như sau: Mẫu chuỗi x u x v , trong đó xn + 1 bản sao của một ký tự không xuất hiện trong cả u hoặc v , và sau đó chạy o ( n 2 ) của bạno(n2)nuvxuxvxn+1$uvo(n2)thuật toán thời gian trên đó. Cả hai "nửa" của chuỗi lặp lại dài nhất sẽ nhất thiết phải bắt đầu bằng , do đó, một nửa xuất phát từ mỗi uv , giải quyết vấn đề LCS. xuv
j_random_hacker

@j_random_hacker LCS có thể được giải trong bằng Suffix Tree hoặc trong O ( n log n ) bằng cách sử dụng băm lăn. O(n+m)O(nlogn)
Ác

@Evil: Tôi chưa thấy làm thế nào, bạn có thể cung cấp thêm một chút chi tiết? (Bạn có chắc là bạn không nghĩ đến chuỗi Sub chung dài nhất , có thể giải quyết được trong những phức tạp thời gian đó không?)
j_random_hacker

@j_random_hacker Tôi nghĩ rằng bạn đang so sánh mục tiêu với LCS (liên tiếp), nhưng ở đây, như bạn đã đề cập, vâng, tôi thậm chí chưa thấy giải pháp làm việc nào trong n ^ 2 cho Kết quả chung dài nhất (Tôi đã tìm thấy một mã lập trình động, được truyền bá trên nhiều trang, thiếu sót, tương tự như câu trả lời bị bỏ qua). Vì vậy, đơn giản là tôi hiểu nhầm ý kiến ​​của bạn, xin lỗi. o(n2)
Ác

Câu trả lời:


-1

Đây là một giải pháp lập trình động.

x1xnT0,,nn

T[i,j]={0if i=0 or j=0,T[i1,j1]+1if xi=xj and ij,max(T[i1,j],T[i,j1])otherwise.
The answer is T[n,n].

Suppose we are at some i,j with i=j+1, and the condition in your if statement is true. Then dp[i][j] = dp[i - 1][j - 1] + 1 implies that the character at position i1=j is part of both subsequences.
j_random_hacker

3
Welcome to Computer Science! Please get rid of the source code and replace it with ideas, pseudo code and arguments of correctness. See here and here for related meta discussions.
Raphael

@Raphael A recursive formula does not count as source code.
Number945

1
@BreakingBenjamin Depending on your language of choice, you can write down the given recurrence more or less literally. The point is that there is no explanation here.
Raphael
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.