Keterulangan yang Terulang (Tersebar) dalam String

26

Pernyataan Masalah Informal:

Diberikan string, mis. SEBUAHCCSEBUAHBBSEBUAHB , 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: SEBUAHCCSEBUAHBBSEBUAHB

Oleh karena itu, kita katakan CSEBUAHB adalah subsequence berulang dari SEBUAHCCSEBUAHBBSEBUAHB . 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 k , apakah panjang berulang k 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 n/2o(n) 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 5 . Bahkan untuk huruf berukuran , ada string dengan urutan berulang paling panjang dari panjang hanya O (n · Σ ^ {- 1/2}) 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.

Sekti
sumber
Sekti, terima kasih. Anda benar: komentar pertama saya salah; Saya sekarang sudah menghapusnya. Di sisi lain, komentar saya yang tersisa adalah berbicara tentang subsequences non-contiguous. Jika diperbaiki, ada cara untuk menyelesaikan masalah Anda (dengan urutan yang tidak bersebelahan, diamanatkan untuk tidak tumpang tindih) dalam waktu O ( n 2 k + 2 ) atau lebih. Setiap subproblem dp melacak indeks semua huruf merah dan semua huruf biru yang dipilih sejauh ini. Ini mungkin tidak menarik, karena tidak memberi tahu kita apa yang terjadi ketika k adalah bagian dari input. kO(n2k+2)k
DW
@DW Mengapa tidak dapat pertanyaan resmi dijawab secara efisien dengan ini modifikasi subsequence umum terpanjang? Mungkin saya kehilangan sesuatu dan seseorang dapat mengklarifikasi untuk saya.
Bryce Kille
@ BryceKille, saya tidak tahu; mungkin bisa. Jika Anda mengetahui cara melakukannya, saya harap Anda akan menulis jawaban!
DW

Jawaban:

-2

Ini dapat diselesaikan di 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 uG(saya,j)SS[saya]=S[j]kamuvkamu dapat dilanjutkan oleh untuk membentuk urutan panjang 2 yang berulangv

1. 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.HAI(n2)cm=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 ) .HAI(1)kamuv(kamu,v)HAI(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 .GSebuahbbcSebuahcSebuahbcHAI(m4)nn+1

4. Ulangi langkah 3 hingga tidak ada lagi jalur yang dapat ditemukan.

noplogist
sumber
Hmm. Terlalu cepat. Pada langkah 3 jumlah yang perlu dipertimbangkan semakin besar. Jadi itu bukan jumlahnya banyak.
noplogist
1
Selamat datang di CS.SE, dan terima kasih telah mencoba menyelesaikan masalah ini! Saya khawatir saya tidak mengerti algoritma Anda. Apa itu Langkah 3? Semua yang saya lihat di "3." adalah beberapa pernyataan deklarasi / pengamatan, tapi saya tidak melihat spesifikasi prosedural dari apa yang seharusnya dilakukan algoritma. Juga, saya tidak melihat apa artinya iterate Langkah 3, atau alasan untuk klaim Anda bahwa waktu sudah cukup. Komentar Anda selanjutnya membuatnya terdengar seperti Anda tidak lagi percaya jawaban Anda benar. Jika demikian, mungkin lebih baik untuk menghapus jawaban, untuk menghindari kebingungan. HAI(nnm2)
DW
Anda selalu dapat membatalkan penghapusan atau memposting jawaban baru jika Anda mengetahui jawabannya nanti.
DW
DW, terima kasih. Input ke langkah 3 adalah semua diulangi dengan panjang n, dan output adalah semua diulang dengan panjang n + 1. Saya percaya algoritma itu benar tetapi itu bukan algoritma waktu polinomial. Saya sekarang telah menandai klaim yang saya anggap salah.
noplogist
Terima kasih. Saya mengerti. Sayangnya, dengan revisi-revisi itu, saya khawatir jawaban ini tidak menjawab pertanyaan yang diajukan. Pertanyaannya adalah: Apakah NP-keras ini? Apakah ada algoritma yang efisien? Menunjukkan bahwa ada algoritma waktu eksponensial tidak membantu menjawab salah satu dari pertanyaan itu. Memang, itu sudah sepele untuk melihat bahwa ada algoritma waktu eksponensial untuk masalah, tanpa menggunakan teknik mewah. Saya menghargai usaha Anda.
DW