Artikel ini menjelaskan masalah umum yang paling lama (LCS) dari algoritma Java. Bagikan untuk referensi Anda, sebagai berikut:
Deskripsi Masalah: setelah urutan yang diberikan adalah urutan yang diperoleh setelah beberapa elemen dihapus dari urutan. Tepatnya, jika diberikan urutan x = {x1, x2, ..., xm}, maka urutan lain z = {z1, z2, ..., zk} adalah selanjutnya dari x mengacu pada keberadaan urutan subskrip yang ketat {i1, i2, ..., iK}, seperti itu untuk semua j = 1.. Sebagai contoh, urutan z = {b, c, d, b} adalah setelah urutan x = {a, b, c, b, d, a, b}, dan urutan subskrip tambahan yang sesuai adalah {2,3,5,7}. Diberi dua urutan x dan y, ketika urutan lain Z adalah keduanya merupakan selanjutnya dari x dan y, z disebut urutan yang umum dari sekuens x dan y. misalnya, jika x = {a, b, c, b, d, a, b} dan y = {b, d, c, a, b, a}, kemudian urutan {b, c, c, a, a dan y, a dan y, a dan y, a dan y, a, c a {b, c, a, a, c, a, c, a, c, A} juga merupakan zaman yang umum dari x dan y. Selain itu, yang terakhir adalah salah satu yang paling umum dari x dan y, karena x dan y tidak memiliki panjang yang sama dengan panjang lebih dari 4. Diberi dua urutan x = {x1, x2, ..., xm} dan y = {y1, y2, ..., yn}, itu diperlukan untuk ditemukan, itu diperlukan untuk temuan, itu diperlukan, itu diperlukan, itu diperlukan, itu diperlukan, itu diperlukan, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn} temuan, itu diperlukan untuk temuan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn}, itu diperlukan untuk menemukan, yn} temuan.
Analisis Masalah: Misalkan x = {a, b, c, b, d, a, b}, y = {b, d, c, a, b, a}. Cara termudah untuk menemukan yang umum terpanjang dari X dan Y adalah metode lengkap. Untuk beberapa selanjutnya dari X, periksa apakah itu juga merupakan selanjutnya dari Y, dengan demikian menentukan apakah itu adalah selanjutnya dari X dan Y. Dari sifat -sifat set, satu set dengan elemen m memiliki total 2^m yang berbeda, sehingga metode yang lengkap membutuhkan waktu operasi eksponensial. Lebih lanjut mendekomposisi karakteristik masalah, masalah umum yang paling lama sebenarnya memiliki sifat substruktur yang optimal.
Misalkan umum terpanjang dari urutan x = {x1, x2, ... xm} dan y = {y1, y2, ... yn} adalah z = {z1, z2, ... zk}. Lalu ada:
(1) jika xm = yn, maka zk = xm = yn, dan zk-1 adalah yang umum terpanjang setelah xm-1 dan yn-1.
(2) Jika xm! = Yn dan zk! = Xm, maka z adalah yang umum terpanjang dari xm-1 dan y.
(3) Jika xm! = Yn dan zk! = Yn, maka z adalah yang paling lama umum dari x dan yn-1.
Di mana, xm-1 = {x1, x2 ... xm-1}, yn-1 = {y1, y2 ... yn-1}, zk-1 = {z1, z2 ... zk-1}.
Hubungan Rekursif: Gunakan C [i] [j] untuk merekam panjang sesaat yang paling lama dari sekuens Xi dan YJ. Di mana, xi = {x1, x2 ... xi}, yj = {y1, y2 ... yj}. Ketika i = 0 atau j = 0, urutan kosong adalah yang paling lama umum dari xi dan yj. Saat ini, C [i] [j] = 0; ketika saya, j> 0, xi = yj, c [i] [j] = c [i-1] [j-1] +1; Saat aku, j> 0, xi! = yj,
c [i] [j] = max {c [i] [j-1], c [i-1] [j]}, dengan demikian membangun hubungan rekursif sebagai berikut:
Construct the optimal solution: From the above analysis, we can see that to find the longest common subsequence of X={x1,x2,...xm} and Y={y1,y2,...yn}, you can perform recursively in the following way: When xm=yn, find the longest common subsequence of xm-1 and yn-1, and then add xm(=yn) to the tail to get the longest common subsequence of X and Y. Ketika xm! = Yn, dua sub-masalah harus diselesaikan, yaitu, untuk menemukan salah satu sub-sekuens umum terpanjang dari XM-1 dan Y dan salah satu sub-sekuens umum terpanjang dari X dan YN-1. Semakin lama dari dua persiapan umum ini adalah zaman umum terpanjang dari X dan Y. Misalkan array B [i] [j] mencatat nilai C [i] [j] dari mana sub-masalah diperoleh. Mulai dari B [m] [n], cari di array B sesuai dengan nilainya. Ketika B [i] [j] = 1, zaman umum yang paling lama dari Xi dan YJ adalah selanjutnya yang diperoleh dengan menambahkan Xi ke ekor XI-1 dan YJ-1. Ketika B [i] [j] = 2, itu berarti bahwa zaman umum yang paling lama dari Xi dan YJ sama dengan yang paling lama terjadi pada XI-1 dan YJ-1. Ketika B [i] [j] = 3, zaman umum yang paling lama dari Xi dan YJ sama dengan zaman umum yang paling lama dari Xi dan YJ-1.
Kodenya adalah sebagai berikut:
paket lcs; kelas publik lcs {public static int [] [] lcslength (string [] x, string [] y) {int m = x.length; int n = y.length; int [] [] b = int int [x.length] [y.length]; int [] [] c = int int [x.length] [y.length]; untuk (int i = 1; i <m; i ++) {c [i] [0] = 0; } untuk (int i = 1; i <n; i ++) {c [0] [i] = 0; } untuk (int i = 1; i <m; i ++) {for (int j = 1; j <n; j ++) {if (x [i] == y [j]) {c [i] [j] = c [i-1] [j-1]+1; b [i] [j] = 1; } else if (c [i-1] [j]> = c [i] [j-1]) {c [i] [j] = c [i-1] [j]; b [i] [j] = 2; } else {c [i] [j] = c [i] [j-1]; b [i] [j] = 3; }}} return b; } public static void lcs (int [] [] b, string [] x, int i, int j) {if (i == 0 || j == 0) return; if (b [i] [j] == 1) {lcs (b, x, i - 1, j - 1); System.out.print (x [i] + ""); } lain jika (b [i] [j] == 2) {lcs (b, x, i - 1, j); } else lcs (b, x, i, j-1); } public static void main (string args []) {System.out.println ("Hasil tes wulin.com:"); String [] x = {"", "a", "b", "c", "b", "d", "a", "b"}; String [] y = {"", "b", "d", "c", "a", "b", "a"}; int [] [] b = lcslength (x, y); System.out.println ("Umum terpanjang setelah x dan y adalah:"); Lcs (b, x, x.length - 1, y.length - 1); }}Hasil Menjalankan:
Untuk informasi lebih lanjut tentang algoritma java, pembaca yang tertarik dengan situs ini dapat melihat topik: "struktur data java dan tutorial algoritma", "ringkasan tips node dom java", "ringkasan file operasi java dan direktori" dan "ringkasan tip operasi java cache" tips java "tips java" Tips "Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.