Algoritma tercepat untuk menemukan urutan palindrom terpanjang

8

Pertama-tama kita harus membaca sebuah kata, dan ukuran yang diinginkan.
Maka kita perlu menemukan palindrom terpanjang yang dibuat oleh karakter dalam kata ini yang digunakan secara berurutan.
Misalnya untuk ukuran = 7 dan kata = "abcababac" jawabannya adalah 7 ("abababa").

Catatan tambahan: ukuran kata lebih kecil dari 3000.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Menurut max palindrome maksud Anda, Anda dapat menghapus karakter dari string untuk meninggalkan palindrom, dan Anda menginginkan palindrom terpanjang (atau penghapusan minimum)?
1
Dalam contoh Anda, ada juga cababac dengan panjang 7. Karakter yang dihapus kemudian bersebelahan dan di akhir. Apakah Anda diizinkan melakukan salah satu dari pembatasan ini? Mereka sangat menyederhanakan pencarian.
6
Ini sudah dijawab di Stack Overflow: bagaimana menemukan urutan palindromik terpanjang?
@GenericHuman: Jawaban terbaik dalam pertanyaan itu baik untuk bab buku teks yang dibacakan si penanya. Ini bukan jawaban yang bagus untuk penanya ini. Lihat pertanyaan ini: sebagai gantinya stackoverflow.com/questions/7043778/… .
Neil G
1
Bagaimana ukurannya? Anda mengatakan Anda menginginkan "max palindrome", jadi bagaimana jika palindrom terpanjang lebih panjang atau lebih pendek dari ukuran yang diberikan?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

6

Ada algoritma yang dinamai berdasarkan algoritma Manacher, yang sangat cepat, algoritma waktu linier.

Lihat referensi Wikipedia


Catatan tambahan: Jika Anda benar-benar terbiasa dengan Algoritma Z , Anda akan menemukan bahwa mereka mirip.


Edit

Saya baru saja salah mengerti arti OP (tapi saya tidak ingin menghapus informasi yang diproses. Ini agak berguna). Maksudnya adalah palindrom terpanjang dari sebuah string, sehingga pemrograman dinamis tampak bagus: mana menunjukkan panjang palindrome terpanjang dari , dan adalah kurung Iverson. Saya pikir itu seperti LCS .

fj,k=max(fj,k+1,fj+1,k,2[Sj=Sk]+fj+1,k1),j<kfk,k=1fj,k=0,j>k
fj,kSj..k[P]
Yai0Phah
sumber
4
Anda menjawab dalam kasus substring, tetapi pertanyaannya adalah tentang selanjutnya.
Bukankah istilah pertama adalah f (j, k-1)?
Abhishek Bansal
5

Algoritma tercepat yang dapat saya pikirkan adalah menerapkan LCS dengan cara yang kreatif. Ini dapat menyelesaikan masalah ini dalam waktu O (N ^ 2) dan ruang O (N ^ 2) di mana N adalah ukuran string.

LCS (S, reverse (S)) akan memberi Anda urutan palindromik terbesar, karena urutan palindromik terbesar adalah urutan umum terbesar antara string S dan kebalikannya.

Misalnya,
S = "abcababac"
T = "cababacba" (kebalikan dari S)
LCS (S, T) = "abababa"

Shashwat
sumber
Dapatkah Anda berpendapat bahwa algoritma ini adalah yang tercepat yang dapat dibuat oleh siapa saja, seperti pertanyaannya?
Juho
@ Juho: Saya tidak bisa. :( Ini adalah algoritma tercepat yang saya tahu. Namun diterima di UVA online judge ( uva.onlinejudge.org/external/114/11404.html ) dan di ACM kendala masalahnya adalah hanya solusi yang dioptimalkan yang akan berlalu. Karena itu solusinya cukup cepat, tidak yakin tentang yang tercepat
Shashwat
2

Masalah menemukan LPS dari sebuah string dapat dikonversi menjadi menemukan Sub-urutan Umum Terpanjang dari dua string. Dalam hal ini, satu string akan menjadi yang asli dan yang kedua akan menjadi terbalik dari string yang asli.

Masalah Pemanjangan Umum Terpanjang adalah seperti masalah pencocokan pola, kecuali bahwa Anda diizinkan untuk melewati karakter dalam teks. Juga, tujuannya adalah untuk mengembalikan hanya satu pertandingan, yang selama mungkin.

LCS dapat dipecahkan dalam menggunakan Rekursi dan Memoisasi.O(n2)

Ada algoritma yang sedikit lebih cepat ditemukan oleh Masek dan Paterson dari kompleksitas waktu . Tautan kertas: Masek dan PatersonO(n2/lgn)

Dua algoritma lain disajikan oleh Hirschberg untuk menghitung LCS dari dua string (ukuran ) dan (ukuran ). Berdasarkan asumsi bahwa simbol-simbol yang mungkin muncul dalam string ini berasal dari beberapa alfabet ukuran (yang sebenarnya berlaku di sebagian besar kasus). Jadi simbol dapat disimpan dalam memori menggunakan bit, yang akan muat dalam satu kata memori. dua simbol dapat dibandingkan dalam waktu. Jumlah berbeda dalam string dilambangkan dengan , yang tentu saja kurang dari dan .AnBmtlog(t)O(1)Bsmt

  1. Yang ini membutuhkan waktu di mana adalah panjang LCS. Ini digunakan ketika panjang LCS diharapkan menjadi kecil. Ketika kita memecahkan masalah ini dengan menggunakan Pemrograman Dinamis maka kita menemukan bahwa sebagian besar entri dalam matriks adalah sama, sehingga kita dapat menggunakan gagasan Pemrograman Dinamis Jarang.O(pn+nlgn)p

  2. Algoritma ini membutuhkan waktu . Ini sangat efisien ketika panjang LCS mendekati , dalam hal ini akan dekat dengan .O(p(m+1p)logn)mO(nlgn)

Prosedur dan algoritma terperinci dijelaskan dalam makalah Hirschberg .

Algoritma lain yang baik diusulkan oleh Sohel Rahman yang berjalan dalam waktu , di mana adalah jumlah total pasangan posisi yang dipesan untuk string strings. Ini tidak berlaku ketika adalah urutan , tetapi ada banyak kasus ketika adalah urutan . Yang ini menggunakan konsep RMQ (Range Maximum Query). Tautan kertas: RahmanO(Rloglogn)RRO(n2)Rn

Surendra
sumber
@ FrankW, terima kasih! Saya telah mengedit jawabannya. Sekarang tautan terlihat.
Surendra
Format Anda masih kurang; silakan periksa edit saya untuk melihat apa yang mungkin. Referensi artikel masih buruk karena mereka mengandalkan tautan yang selalu berfungsi, selamanya. Lihat di sini untuk saran; judul, penulis, dan tahun harus diberikan (setidaknya).
Raphael
Dua masalah dengan apa yang Anda tulis: 1) "memerlukan " tidak ada artinya (karena memberikan batas atas ), dan mengabaikan yang mungkin salah; Saya kira mereka menunjukkan batas atas dari pesanan ini tetapi algoritma mungkin lebih cepat. 2) Setidaknya dalam paragraf terakhir, Anda ingin . O()OΩ(n2)
Raphael
-1

Saya mungkin melewatkan sesuatu, karena sepertinya agak sepele bagi saya: Cobalah untuk memasangkan setiap karakter dengan karakter yang sama. Kemudian letakkan karakter pertama dari setiap pasangan di sisi kiri, karakter lain di sisi kanan, dan jika ada karakter yang tersisa (yaitu, karakter tidak dipasangkan dengan yang lain), lalu pilih salah satu dari mereka dan letakkan yang di dalam tengah.


sumber
1
Ketika Anda memiliki (dengan kata ), bagaimana Anda memutuskan apakah karakter pertama dan terakhir palindrome adalah atau ? Anda perlu memeriksa isi sebelum Anda membuat keputusan jika Anda ingin memiliki palindrom terpanjang. aubvawbu,v,wabu,v,w