В этой статье описывается самая продолжительная проблема последующей последовательности (LCS) алгоритмов Java. Поделитесь этим для вашей ссылки, следующим образом:
Описание задачи: Последующая последовательность - это последовательность, полученная после удаления нескольких элементов из последовательности. Чтобы быть точным, если задана последовательность x = {x1, x2,…, xm}, то другая последовательность z = {z1, z2,…, zk} - это последующая x, относится к существованию строго последовательности подписок {i1, i2,…, ik}, так же, что для всех j = 1,2,… ki. Например, последовательность z = {b, c, d, b} представляет собой последовательность последовательности x = {a, b, c, b, d, a, b}, а соответствующая последовательность инкрементных индексов составляет {2,3,5,7}. Given two sequences X and Y, when the other sequence Z is both a subsequence of X and Y, Z is called a common subsequence of sequences X and Y. For example, if X= { A, B, C, B, D, A, B} and Y= {B, D, C, A, B, A}, then the sequence {B, C, A} is a common subsequence of X and Y, and the sequence {B, C, B, A} также является общей последующей последовательности X и Y. Более того, последнее является одной из самых длинных общих последующих последствий x и y, потому что x и y не имеют общих последующих последствий длины, превышающей 4. Учитывая две последовательности x = {x1, x2,…, xm} и y = {y1, y2,…, yn}, необходимо найти один из самых обычных подподобных.
Анализ проблем: пусть x = {a, b, c, b, d, a, b}, y = {b, d, c, a, b, a}. Самый простой способ найти самую длинную общую последующую последовательность X и Y - исчерпывающий метод. Для множества подпоследований x проверьте, является ли это также последующей y, тем самым определяя, является ли это общей последующей последовательности x и y. от свойств набора, набор с элементами M имеет в общей сложности 2^m различных последующих последствий, поэтому исчерпывающий метод требует экспоненциального времени работы. Дальнейшее разложение задачных характеристик, самая продолжительная проблема последующей последовательности фактически обладает оптимальными свойствами субструктуры.
Предположим, что самая длинная общая последовательность последовательностей x = {x1, x2, ... xm} и y = {y1, y2, ... yn} IS z = {z1, z2, ... zk}. Тогда есть:
(1) Если xm = yn, то zk = xm = yn и zk-1-самая продолжительная последовательность XM-1 и YN-1.
(2) Если XM! = YN и ZK!
(3) Если xm! = Yn и zk!
Где, xm-1 = {x1, x2… xm-1}, yn-1 = {y1, y2… yn-1}, zk-1 = {z1, z2… zk-1}.
Рекурсивные отношения: используйте C [i] [j], чтобы записать длину самой длинной общей последующей последовательности XI и YJ. Где, xi = {x1, x2… xi}, yj = {y1, y2… yj}. Когда i = 0 или j = 0, пустая последовательность является самой длинной общей последующей последовательностью XI и YJ. В это время c [i] [j] = 0; Когда я, j> 0, xi = yj, c [i] [j] = c [i-1] [j-1] +1; Когда я, j> 0, xi! = yj,
c [i] [j] = max {c [i] [j-1], c [i-1] [j]}, тем самым установив рекурсивные отношения следующим образом:
Создайте оптимальное решение: из приведенного выше анализа мы видим, что для поиска самой длинной общей последующей последующей последовательности x = {x1, x2, ... xm} и y = {y1, y2, ... yn}, вы можете выполнять рекурсивно следующим образом: когда XM = yn, найдите длительное общее последующее последующее значение XM-1 и yn, а затем добавить XM (= yn yt-nate suce-sececed and yn-1, а затем добавить xm (= yn), и yn yast sececexence as-secence, а затем добавить xm (= yn yte sececexence и yn, а затем добавить XM (= yn). Y. Когда XM! = Yn, должны быть решены две подпрограммы, то есть найти одну из самых длинных общих последовательностей XM-1 и Y и одной из самых длинных общих подпоследований x и yn-1. Более длинные из этих двух общих подпоследований являются самой длинной общей последующей последовательностью X и Y. Предположим, что массив B [i] [J] записывает значение c [i] [j], из которой получен подпрограмма. Начиная с B [M] [n], поиск в массиве B в соответствии с его значением. Когда b [i] [j] = 1, самой длинной общей последующей последовательности Xi и Yj является последующей, полученной путем добавления Xi к хвосту Xi-1 и Yj-1. Когда b [i] [j] = 2 означает, что самая длинная общая последующая последовательность XI и YJ-это то же самое, что и самая длинная общая последующая последовательность Xi-1 и YJ-1. Когда b [i] [j] = 3, самая длинная общая последующая последовательность XI и YJ-такая же, как и самая длинная общая последующая последовательность XI и YJ-1.
Код заключается в следующем:
Package lcs; public class lcs {public static int [] [] lcslength (string [] x, string [] y) {int m = x.length; int n = y.length; int [] [] b = new int [x.length] [y.length]; int [] [] c = new int [x.length] [y.length]; for (int i = 1; i <m; i ++) {c [i] [0] = 0; } for (int i = 1; i <n; i ++) {c [0] [i] = 0; } for (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] + ""); } else if (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 ("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 («Самая длинная общая последующая последовательность x и y Is:»); LCS (B, X, X.Length - 1, Y.Length - 1); }}Результаты работы:
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.