Tìm mẫu lặp lại dài nhất trong một chuỗi


9

Tôi đang tìm kiếm một thuật toán hiệu quả để tìm ra mẫu lặp lại dài nhất trong một chuỗi.

Ví dụ, hãy xem xét chuỗi số sau:

5431428571428571428571428571427623874534.

Như bạn có thể thấy, 142857142857là mẫu dài nhất được lặp lại trong một vài lần (ít nhất hai lần) trong chuỗi này.

Chuỗi lặp đi lặp lại không nên chứa bất kỳ ý tưởng nào hơn là brute-force?


3
Bạn đã không xác định được ý nghĩa của một vài lần, nhưng nếu một lần hai lần thì tính là một vài lần, thì đó 142857không phải là thời gian dài nhất vì đó là một vài lần 142857142857. Tôi nghĩ rằng bạn nên chỉnh sửa câu hỏi để làm rõ những gì bạn muốn nói về mô hình lặp đi lặp lại.
Tsuyoshi Ito

điểm rất tốt. Tôi sẽ cập nhật câu hỏi.

8
Bạn có yêu cầu sự xuất hiện của mô hình để tách rời nhau không? Bởi vì nếu không, 142857142857 vẫn không phải là sự lặp lại lâu nhất; 142857142857142857142 xảy ra hai lần. Trong mọi trường hợp, câu trả lời thông thường cho các câu hỏi như thế này là "cây hậu tố".

Câu trả lời:


15

Vấn đề là đáng ngạc nhiên không tầm thường. Đầu tiên, hai thuật toán vũ phu. Một hình vuông ( "mô hình lặp đi lặp lại") được cho bởi nó dài và vị trí p , và đòi hỏi thời gian Ôi() để xác minh. Nếu chúng ta đi khắp nơi p , chúng ta có được một Ôi(n3) thuật toán. Chúng tôi có thể cải thiện vào đó bằng cách đầu tiên Looping trên , và sau đó quét chuỗi với hai con trỏ chạy ở khoảng cách . Bằng cách này, người ta có thể xác minh xem một hình vuông có độ dài 2 tồn tại trong thời gian tuyến tính, đưa ra một tổng thời gian chạy Ôi(n2) .

Kolpakov và Kucherov đã phát triển một thuật toán để tìm tất cả các lần lặp tối đa trong một từ trong thời gian Ôi(n) [1], và thuật toán của chúng có thể được sử dụng để tìm tất cả các bình phương tối đa trong thời gian Ôi(n) . Một lặp lại là một subword dạng wkx , nơi k2x là một tiền tố thích hợp của w . Quảng trường lớn nhất chứa trong lặp lại đó là (wk/2)2. Sử dụng công thức này, với tất cả các lần lặp tối đa trong một từ (trong đó chỉ có Ôi(n) nhiều), người ta có thể tìm thấy hình vuông lớn nhất.


[1] Kolpakov, R., & Kucherov, G. (1999). Tìm sự lặp lại tối đa trong một từ trong thời gian tuyến tính . Trong nền tảng của Khoa học máy tính, 1999. Hội nghị chuyên đề hàng năm lần thứ 40 về (trang 596-604). IEEE.

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.