Pernyataan Masalah Informal:
Diberikan string, mis. , kami ingin mewarnai beberapa huruf merah dan beberapa huruf biru (dan beberapa tidak sama sekali), sehingga hanya membaca huruf merah dari kiri ke kanan menghasilkan hasil yang sama seperti membaca hanya huruf biru.
Dalam contoh kita bisa mewarnai mereka seperti ini:
Oleh karena itu, kita katakan adalah subsequence berulang dari . Ini juga merupakan proses berulang yang terpanjang (yang mudah untuk diperiksa).
Bisakah kita menghitung urutan berulang paling lama secara efisien?
Pertanyaan Resmi:
Apakah NP-sulit untuk memutuskan untuk string dan beberapa , apakah panjang berulang ada dalam string?
- Jika demikian: Masalah mana yang dapat direduksi menjadi masalah ini?
- Jika tidak: Apa itu algoritma yang efisien? (jelas, algoritma ini kemudian dapat digunakan untuk menghitung urutan berulang yang terpanjang)
Pertanyaan Bonus:
Akankah mereka selalu menjadi pengulangan panjang jika ukuran alfabet dibatasi oleh konstanta?
(Ini diketahui benar untuk huruf biner.)
Sunting 2: Jawaban negatif untuk Pertanyaan Bonus sudah dikenal untuk alfabet ukuran minimal . Bahkan untuk huruf berukuran , ada string dengan urutan berulang paling panjang dari panjang hanya O (n · Σ ^ {- 1/2}) O ( n · Σ - 1 / 2 ) . String acak sudah cukup untuk menunjukkan ini. Hasilnya sudah ada, tetapi saya mengabaikannya.
Edit: Catatan:
Beberapa orang berarti "substring" ketika mereka mengatakan "berikutnya". Bukan saya. Ini bukan masalah menemukan substring dua kali.
Jawaban:
Ini dapat diselesaikan diG ( i , j ) S S[ i ] = S[ j ] kamu v kamu dapat dilanjutkan oleh untuk membentuk urutan panjang 2 yang berulangv
waktu polinomialdengan membuat grafik di mana setiap node merupakan titik ( i , j ) dalam beberapa subsequence berulang dari S sehingga S [ i ] = S [ j ] . Edge antara node u dan v berarti u1. Temukan node. Ini dapat dilakukan dalam waktu dengan membuat daftar indeks yang diurutkan untuk setiap karakter c , dan kemudian menghitung pasangan unik. Tidak ada lebih dari m = n 2 node.O ( n2) c m = n2
2. Temukan tepinya. Dibutuhkan waktu untuk memeriksa apakah simpul u dapat dilanjutkan oleh simpul v , jadi dengan mempertimbangkan semua pasangan ( u , v ) langkah ini membutuhkan waktu O ( m 2 ) .O ( 1 ) kamu v ( kamu , v ) O ( m2)
3. Perhatikan bahwa jalur terpanjang di mungkin bukan urutan berulang yang valid. Pertimbangkan jalur a b dan b c . Jika ada kelebihan a c kemudian a b c adalah subsequence berulang valid panjang 3. Oleh karena itu dibutuhkan O ( m 4 ) waktu untuk menemukan semua subsequences diulang panjang 3. Dalam kasus umum dibutuhkan waktu linear untuk memeriksa apakah dua jalur panjang yang valid n dapat digabungkan menjadi jalur panjang yang valid n + 1 .G a b b c a c a b c O ( m4) n n + 1
4. Ulangi langkah 3 hingga tidak ada lagi jalur yang dapat ditemukan.
sumber