Temukan pola berulang terpanjang dalam sebuah string

9

Saya mencari algoritma yang efisien untuk menemukan pola berulang terpanjang dalam sebuah string.

Misalnya, perhatikan string angka berikut:

5431428571428571428571428571427623874534.

Seperti yang Anda lihat, 142857142857adalah pola terpanjang yang diulang beberapa kali (setidaknya dua kali) dalam string ini.

String yang diulang seharusnya tidak mengandung ide apa pun alih-alih kekerasan?

Juho
sumber
3
Anda tidak mendefinisikan apa yang dimaksud "beberapa kali", tetapi jika "dua kali" dianggap sebagai "beberapa kali," maka 142857itu bukan yang terpanjang karena 142857142857lebih lama. Saya pikir Anda harus mengedit pertanyaan untuk memperjelas apa yang Anda maksud dengan “pola berulang.”
Tsuyoshi Ito
poin yang sangat bagus. Saya akan memperbarui pertanyaan.
8
Apakah Anda membutuhkan kemunculan pola yang terpisah satu sama lain? Karena jika tidak, 142857142857 masih bukan pengulangan terpanjang; 142857142857142857142 terjadi dua kali. Bagaimanapun, jawaban yang biasa untuk pertanyaan seperti ini adalah "pohon sufiks".

Jawaban:

15

Masalahnya secara mengejutkan adalah non-sepele. Pertama, dua algoritma brute force. Kotak ("pola berulang") diberikan oleh panjangnya dan posisi hal , dan membutuhkan waktu HAI() untuk memverifikasi. Jika kita membahas semua dan hal , kita mendapatkan algoritma HAI(n3) . Kita dapat memperbaikinya dengan terlebih dahulu mengulangi , dan kemudian memindai string dengan dua pointer berjalan pada jarak . Dengan cara ini, seseorang dapat memverifikasi apakah kuadrat panjang 2 ada dalam waktu linier, memberikan total waktu berjalan HAI(n2) .

Kolpakov dan Kucherov mengembangkan algoritma untuk menemukan semua pengulangan maksimal dalam kata dalam waktu HAI(n) [1], dan algoritma mereka dapat digunakan untuk menemukan semua kotak maksimal dalam waktu HAI(n) . Sebuah ulangi adalah subword dari bentuk wkx , di mana k2 dan x adalah awalan yang tepat w . Kuadrat terbesar yang terkandung dalam pengulangan itu adalah (wk/2)2. Menggunakan rumus ini, mengingat semua pengulangan maksimal dalam sebuah kata (yang hanya ada HAI(n) banyak), orang dapat menemukan kuadrat terbesar.


[1] Kolpakov, R., & Kucherov, G. (1999). Menemukan pengulangan maksimal dalam sebuah kata dalam waktu linier . Dalam Yayasan Ilmu Komputer, 1999. Simposium Tahunan ke-40 tentang (hal. 596-604). IEEE.

Yuval Filmus
sumber