Saya mencari algoritma yang efisien untuk menemukan pola berulang terpanjang dalam sebuah string.
Misalnya, perhatikan string angka berikut:
5431428571428571428571428571427623874534
.
Seperti yang Anda lihat, 142857142857
adalah pola terpanjang yang diulang beberapa kali (setidaknya dua kali) dalam string ini.
String yang diulang seharusnya tidak mengandung ide apa pun alih-alih kekerasan?
142857
itu bukan yang terpanjang karena142857142857
lebih lama. Saya pikir Anda harus mengedit pertanyaan untuk memperjelas apa yang Anda maksud dengan “pola berulang.”Jawaban:
Masalahnya secara mengejutkan adalah non-sepele. Pertama, dua algoritma brute force. Kotak ("pola berulang") diberikan oleh panjangnyaℓ dan posisi hal , dan membutuhkan waktu O ( ℓ ) untuk memverifikasi. Jika kita membahas semua ℓ dan hal , kita mendapatkan algoritma O ( 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 O ( n2) .
Kolpakov dan Kucherov mengembangkan algoritma untuk menemukan semua pengulangan maksimal dalam kata dalam waktuO ( n ) [1], dan algoritma mereka dapat digunakan untuk menemukan semua kotak maksimal dalam waktu O (n ) . Sebuah ulangi adalah subword dari bentuk wkx , di mana k ≥ 2 dan x adalah awalan yang tepat w . Kuadrat terbesar yang terkandung dalam pengulangan itu adalah ( b⌊ k / 2 ⌋)2 . Menggunakan rumus ini, mengingat semua pengulangan maksimal dalam sebuah kata (yang hanya ada O ( 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.
sumber