Acak dua string dibentuk dengan memotong karakter ke string baru, menjaga karakter masing-masing string dalam urutan. Misalnya, MISSISSIPPI
adalah shuffle dari MISIPP
dan SSISI
. Biarkan saya memanggil string kuadrat jika itu adalah shuffle dari dua string yang identik. Sebagai contoh, ABCABDCD
adalah kuadrat, karena itu adalah shuffle dari ABCD
dan ABCD
, tetapi string ABCDDCBA
tidak kuadrat.
Apakah ada algoritma cepat untuk menentukan apakah suatu string adalah kuadrat, atau apakah itu NP-hard? Pendekatan pemrograman dinamis yang jelas tampaknya tidak berhasil.
Bahkan case khusus berikut nampaknya sulit: (1) string di mana setiap karakter muncul paling banyak empat enam kali, dan (2) string dengan hanya dua karakter berbeda. Seperti yang ditunjukkan Per Austrin di bawah ini, kasus khusus di mana setiap karakter muncul paling banyak empat kali dapat dikurangi menjadi 2SAT.
Pembaruan: Masalah ini memiliki formulasi lain yang dapat membuat bukti kekerasan lebih mudah.
Pertimbangkan grafik G yang simpulnya adalah bilangan bulat 1 sampai n; identifikasi setiap sisi dengan interval nyata di antara titik akhir. Kami mengatakan bahwa dua tepi G bersarang jika satu interval dengan benar berisi yang lainnya. Misalnya, tepi (1,5) dan (2,3) bersarang, tetapi (1,3) dan (5,6) tidak, dan (1,5) dan (2,8) tidak. Pencocokan dalam G tidak bersarang jika tidak ada tepi yang bersarang. Apakah ada algoritma cepat untuk menentukan apakah G memiliki pencocokan sempurna non-bersarang, atau apakah itu masalah NP-keras?
Memisahkan string adalah sama dengan menemukan pencocokan sempurna yang tidak bersarang di dalam gabungan kelompok klik (dengan tepi antara karakter yang sama). Secara khusus, unshuffling string biner setara dengan menemukan pencocokan sempurna non-bersarang dalam penyatuan terpisah dari dua klik. Tetapi saya bahkan tidak tahu apakah masalah ini sulit untuk grafik umum, atau mudah untuk setiap kelas grafik yang menarik.
Ada algoritma polinomial-waktu yang mudah untuk menemukan kecocokan non- persimpangan yang sempurna .
Pembaruan (24 Jun 2013): Masalahnya terpecahkan! Sekarang ada dua bukti independen yang mengidentifikasi string persegi adalah NP-complete.
Pada November 2012, Sam Buss dan Michael Soltys mengumumkan pengurangan dari 3-partisi , yang menunjukkan bahwa masalahnya sulit bahkan untuk string lebih dari alfabet 9 karakter. Lihat "Mengosongkan Alun-Alun adalah NP-Hard ", Jurnal Ilmu Sistem Komputer 2014.
Pada Juni 2013, Romeo Rizzi dan Stéphane Vialette menerbitkan pengurangan dari masalah urutan umum terpanjang yang pernah ada . Lihat " Mengenali Kata-Kata Yang Kuadrat untuk Produk Acak ", Proc. Simposium Ilmu Komputer Internasional ke-8 di Rusia , Springer LNCS 7913, hlm. 235–245.
Ada juga bukti yang lebih sederhana bahwa menemukan pasangan sempurna yang tidak bersarang adalah NP-hard, karena Shuai Cheng Li dan Ming Li pada tahun 2009. Lihat " Pada dua masalah terbuka pola 2-interval ", Theoretical Computer Science 410 (24-25) ): 2410–2423, 2009.
sumber
Jawaban:
Michael Soltys dan saya telah berhasil membuktikan bahwa masalah menentukan apakah sebuah string dapat ditulis sebagai pengocokan persegi adalah NP lengkap. Ini berlaku bahkan pada alfabet terbatas dengan hanya simbol yang berbeda, meskipun bukti kami ditulis untuk alfabet dengan simbol. Pertanyaan ini masih terbuka untuk huruf yang lebih kecil, katakanlah hanya dengan simbol. Kami belum melihat masalah di bawah pembatasan bahwa setiap simbol hanya muncul kali (atau, lebih umum, jumlah yang konstan kali); jadi pertanyaan itu masih terbuka.9 2 67 9 2 6
Buktinya menggunakan pengurangan dari -Partisi. Terlalu panjang untuk memposting di sini, tetapi pracetak, "Membatalkan pengacakan string adalah -hard", tersedia dari halaman web kami di:NP3 NP
http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/
dan
http://www.cas.mcmaster.ca/~soltys/#Papers .
Makalah ini telah diterbitkan dalam Jurnal Ilmu Sistem Komputer:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
sumber
Untuk kasus khusus yang Anda sebutkan ketika setiap karakter muncul paling banyak empat kali, ada pengurangan sederhana menjadi 2-SAT (kecuali saya kehilangan sesuatu ...), sebagai berikut:
Poin penting adalah bahwa untuk setiap karakter, ada (paling banyak) dua cara yang valid untuk mencocokkan kejadian karakter (kemungkinan ketiga akan bersarang). Gunakan variabel boolean untuk mewakili yang mana dari dua pencocokan yang dipilih. Sekarang tugas untuk variabel-variabel ini memberikan unfuffle yang valid dari iff string untuk setiap pasangan tepi yang bersarang, tidak keduanya dipilih. Kondisi ini dapat secara tepat dijelaskan oleh disjungsi dari variabel (mungkin dinegasikan) sesuai dengan dua karakter yang terlibat.
sumber
Berikut ini adalah algoritma yang mungkin memiliki peluang untuk menjadi benar meskipun tampaknya sulit untuk dibuktikan dan saya tidak akan bertaruh rumah di atasnya ...
Setelah pilihan serakah kita membersihkan grafik lagi, dan seterusnya, dan proses berakhir ketika grafik (mudah-mudahan) pencocokan sempurna non-bersarang.
Pada awalnya saya pikir ini kira-kira seperti melihat-lihat kecil di depan dalam algoritma serakah dan tidak benar-benar bekerja, tetapi saya merasa sangat sulit untuk membuat contoh tandingan.
sumber
Solusi yang Sam Buss dan saya usulkan pada bulan November 2012 (menunjukkan bahwa unshuffling persegi di NP-hard dengan pengurangan dari 3-Partition) sekarang menjadi artikel yang diterbitkan dalam Journal of Computer System Sciences:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
sumber
Romeo Rizzi dan Stéphane Vialette membuktikan bahwa mengenali string kuadrat adalah NP-lengkap dalam makalah 2013 mereka " Pada Mengenali Kata-kata Yang Kuadrat untuk Produk Shuffle ", dengan mengurangi dari masalah urutan biner terpanjang. Mereka menyatakan bahwa kompleksitas unshuffling string biner masih terbuka.
Bukti yang bahkan lebih sederhana bahwa menemukan pencocokan sempurna non-bersarang adalah NP-lengkap diberikan oleh Shuai Cheng Li dan Ming Li dalam makalah 2009 mereka " Pada dua masalah terbuka pola 2-interval ". Namun, mereka menggunakan terminologi yang diwarisi dari bioinformatika. Alih-alih "pencocokan non-bersarang sempurna", mereka menyebutnya "DIS-2-IP- masalah". Kesetaraan antara dua masalah dijelaskan oleh Blin, Fertin, dan Vialette :{<,≬}
Pembaruan (25 Februari 2019): Bulteau dan Vialette menunjukkan bahwa masalah keputusan unhuffling string biner adalah NP-lengkap dalam makalah mereka, Mengenali kotak shuffle biner adalah NP-hard .
sumber
Apakah ini membantu?
http://users.soe.ucsc.edu/~manfred/pubs/J1.pdf
sumber
PERNAH PIKIRAN, JAWABAN INI SALAH. Gagal pada input "AABAAB": rakus mencocokkan dua A pertama satu sama lain membuat mustahil untuk mencocokkan simbol yang tersisa. Saya meninggalkannya daripada menghapusnya untuk membantu orang lain menghindari membuat kesalahan yang sama.
Tampak bagi saya bahwa selalu aman untuk mencocokkan setiap karakter berturut-turut dari kotak yang seharusnya dengan rakus dengan karakter lain yang sederajat yang berada di posisi sedini mungkin. Artinya, saya pikir algoritma waktu linier berikut ini harus bekerja:
Loop melalui setiap posisi i dalam string input, i = 0, 1, 2, ... n. Untuk setiap posisi i, periksa apakah posisi itu sudah cocok dengan beberapa posisi sebelumnya dalam string. Jika tidak, cocokkan dengan karakter yang sama yang muncul setelah posisi terakhir yang cocok dan sebaliknya sedini mungkin dalam string. Jika kecocokan tidak ditemukan untuk beberapa karakter, nyatakan bahwa inputnya bukan kotak; jika tidak, itu adalah himpunan karakter pada pasangan pertama dari setiap pertandingan.
Ini dia dengan Python:
Di sini i adalah variabel loop utama (posisi yang kami coba cocokkan), j adalah pointer ke array pasangan yang cocok yang mempercepat pemeriksaan apakah posisi saya sudah cocok, dan k adalah indeks yang digunakan untuk mencari karakter yang cocok dengan yang ada di posisi i. Ini waktu linier karena i, j, dan k secara monoton meningkat melalui string dan setiap iterasi loop dalam meningkatkan salah satunya.
sumber
Pembaruan: Tidak masuk akal untuk berbicara tentang kesulitan menemukan pencocokan sempurna yang non-bersarang dan non-persimpangan, ketika label dari 1 ke n, karena hanya ada satu. (Ya, saya menendang diri saya sendiri.) Namun, akan masuk akal mengingat rentang yang lebih besar pada label ... jadi saya masih melihat beberapa harapan, tetapi mungkin tidak ada gunanya. Saya pasti harus menindaklanjuti ini lagi.
Saya bisa memikirkan mengapa mungkin sulit menemukan pasangan yang tidak bersarang dan tidak bersilang. Izinkan saya menyebut pencocokan demikian sebagai pencocokan terpisah . Tidak yakin sejauh mana hal ini membantu, tetapi biar saya tetap menyajikan alasannya. (Saya harus menunjukkan bahwa argumen saya, seperti yang ada di sini, tidak lengkap, dan detail yang saya tinggalkan mungkin sangat penting. Namun, saya membayangkan bahwa itu mungkin merupakan permulaan.)
Saya akan mulai dengan masalah yang sedikit berbeda. Diberi grafik yang ujung-ujungnya diwarnai dengan warna , dan simpul diberi label dari ke , apakah ada pencocokan terpisah yang berisi tepat satu sisi dari setiap warna? Masalah ini tampaknya NP-hard (argumen untuk ini lengkap dan langsung - kecuali saya kehilangan sesuatu). Pengurangan memuntahkan grafik yang merupakan gabungan klik-klik.G k 1 n
Pengurangan ini dari Disjoint Factors , masalah NP-lengkap yang diperkenalkan pada [1]. Sebuah contoh faktor disjoint diberikan oleh string di atas alfabet ukuran , dan pertanyaannya adalah apakah ada faktor disjoint , di mana faktor adalah substring yang dimulai dan diakhiri dengan huruf yang sama; dan dua faktor terpisah jika tidak tumpang tindih dalam string (perhatikan bahwa 'bersarang', khususnya, tidak diizinkan juga).k k
Biarkan saya dilambangkan dengan , elemen-elemen alfabet berukuran terkait dengan instance Disjoint Factors.a1,…,ak k
Diberikan contoh faktor disjoint, yaitu, katakanlah string dengan panjang , buat grafik yang memiliki simpul dengan label titik dari ke . Tambahkan tepi antara simpul dan jika posisi yang sesuai memiliki huruf yang sama (katakanlah ), dan juga warna tepi dengan warna .n n 1 n u v ai (u,v) i
Bukti pengurangan pada dasarnya mengikuti dari definisi. Dengan faktor disjoint, kami jelas memiliki pencocokan -disjoint colorful, hanya memilih tepi seperti yang diberikan oleh faktor disjoint, dan mudah untuk melihat bahwa pencocokan yang dihasilkan berwarna-warni dan disjoint. Sebaliknya, jika ada pencocokan -disjoint colourful, maka kita memiliki faktor k disjoint, satu untuk setiap huruf, karena pencocokannya berwarna-warni (dan karenanya mengambil satu faktor per huruf), dan disjoint (sehingga faktor yang sesuai tidak akan tumpang tindih) ).k k k
Untuk menghilangkan warna dan menyempurnakannya, meskipun pada kisaran yang lebih besar , buat modifikasi berikut pada grafik yang dibuat:
Biarkan menunjukkan subset dari simpul yang memiliki label yang merupakan posisi yang terkait dengan huruf . Jika memiliki simpul , maka tambahkan simpul baru dan grafik bipartit lengkap antara dan simpul yang baru ditambahkan. Ulangi, tentu saja, untuk setiap huruf.Ua a Ua A (A−2) Ua
Secara kasar, jika grafik ingin menghasilkan pencocokan sempurna, simpul yang baru diperkenalkan harus cocok dengan simpul , dan mereka akan menjenuhkan semua kecuali sepasang simpul, dan tepi antara simpul yang tersisa akan sesuai dengan faktor disjoint . Saya belum menghitung angka yang harus dikaitkan dengan simpul yang baru ditambahkan ... perhatikan bahwa angka tersebut harus sedemikian sehingga pencocokan yang dihasilkan terpisah. Saya hanya punya perasaan (baca: harapan) bahwa 'bisa dilakukan'!Ua
[1] Pada masalah tanpa kernel polinomial , Hans L. Bodlaender, Rodney G. Downey, Michael R. Fellows dan Danny Hermelin, J. Comput. Syst. Sci.
sumber
Pendekatan ini tidak berhasil: menguraikan kotak yang dikocok dengan mengeluarkan dua huruf yang cocok tidak menghasilkan kotak yang dikocok ... Lihat komentar Radu di bawah ini.
Sebuah proposal menggunakan Rentang Penggabungan Tata bahasa (RCGs, lihat http://hal.inria.fr/inria-00073347/en/ ): SayaΣ
'mberada di bawah kesan bahwa RCG sederhana berikut mengakui Anda 'dikocok kotak' bahasa lebih terbatas alfabet , DIedit setelah komentar pertama Radu: di mana rentang lebih dan menunjukkan kosong tali.Tata bahasa memeriksa dengan predikat kedua yang cocok dengan huruf dari kemunculan kata pertama dengan huruf yang sama dalam kemunculan kata kedua. Kemudian menebak bagaimana mencocokkan sisa dari huruf kata pertama yang tersisa, yaitu dengan substring dari sisanya, yaitu . itu semuanya sebelum milik instance kata pertama; kami menyebutnya dan kami rasa itu cocok dengan beberapa suffix mulai dari . Perhatikan bahwa dan mungkin berisi huruf-huruf dari kedua contoh kata, tetapi dan hanya berisi huruf-huruf dari instance pertama.X1 Y1 Y1 X2 Y2 Y1 Y2 X1 X2
Sebagai contoh, berikut adalah kemungkinan turunan dari string Anda :abcabdcd
Untuk ,0011
Sekarang, Boullier menunjukkan di koran terkait sebelumnya bahwa ada pemrograman polinomial waktu algoritma dinamis untuk RCGs, yang menjawab pertanyaan Anda jika tata bahasa di atasX Y
adalahbenar. Idenya adalah bahwa, meskipun saya disajikan di atas instanciations variabel , , dll sebagai string, mereka benar-benar interval di dalam string input, yang dapat ditabulasi dengan benar.sumber
Pembaruan: Seperti yang ditunjukkan Tsuyoshi Ito dalam komentar, algoritma ini memiliki waktu berjalan yang eksponensial.
Pos asli:
Inilah cara saya memprogram ini di Dunia Nyata.
Kita diberi string S = (S [1], ..., S [n]). Untuk setiap awalan S_r = (S [1], ..., S [r]), ada satu set {(T_i, U_i)} dari pasangan string, sehingga S_r adalah pengocokan (T_i, U_i), dan T_i adalah awalan dari U_i (yaitu U_i 'dimulai dengan' T_i). S_r itu sendiri adalah kotak jika dan hanya jika set ini berisi pasangan (T_i, U_i) dengan T_i = U_i.
Sekarang, kita tidak perlu membuat semua pasangan ini; kita hanya perlu membuat akhiran V_i dari setiap string yang U_i peroleh dengan menghapus salinan T_i-nya. Ini akan menghilangkan jumlah duplikat yang tidak relevan (mungkin eksponensial). Sekarang S_r adalah kotak jika dan hanya jika rangkaian sufiks ini berisi string kosong. Jadi algoritme menjadi:
Misalnya, jika S adalah AABAAB:
Kami dapat membuang semua sufiks yang lebih dari setengah sepanjang string input, jadi ini menyederhanakan untuk:
Saya telah memprogram ini dalam C ++, dan berfungsi pada semua contoh yang diberikan di sini. Saya dapat memposting kode, jika ada yang tertarik. Pertanyaannya adalah: dapatkah ukuran SuffixSet tumbuh lebih cepat daripada secara polinomi?
sumber
EDIT: Ini adalah jawaban yang salah.
Sylvain menyarankan RCG yang sayangnya tidak sesuai untuk "kotak acak" ini. Namun, saya pikir ada satu (EDIT: bukan RCG, lihat komentar Kurt di bawah!) , Yang terlihat sebagai berikut:
Penjelasan: ingat bahwa kita harus mencocokkan simbol yang dapat muncul di mana saja di string, tetapi begitu kita telah mencocokkan dan , kita hanya bisa mencocokkan dan jika menyiratkan ( artinya diutamakan linear). Idenya adalah bahwa kita membagi string untuk membandingkan prefix dari setengahnya. Jika permulaan dari dua substring cocok, kita dapat mengurangi masalah ke string yang tersisa . Jika tidak, kita dapat memindahkan beberapa bagian sisi kanan ke sisi kiria a′ b b′ a≺b a′≺b′ ≺ (1,2) (3) (2) dan lihat apakah ada kecocokan di posisi selanjutnya. Yang penting adalah ini hanya diperbolehkan dalam satu arah!
Berikut ini derivasi untuk (contoh tandingan terhadap RCG Sylvain):100110101010
Saya belum menemukan bukti formal bahwa tata bahasa ini benar-benar menangkap "kotak acak" tetapi seharusnya tidak terlalu sulit. Sylvain telah menyebutkan bahwa masalah keputusan untuk RCG adalah polinomial.
sumber