Рубрики

Java-программа для самой длинной общей подпоследовательности

Постановка задачи LCS: Учитывая две последовательности, найдите длину самой длинной подпоследовательности, присутствующей в обеих из них. Подпоследовательность — это последовательность, которая появляется в том же относительном порядке, но не обязательно является смежной. Например, «abc», «abg», «bdf», «aeg», «acefg» и т. Д. Являются подпоследовательностями «abcdefg». Таким образом, строка длиной n имеет 2 ^ n различных возможных подпоследовательностей.

Это классическая проблема информатики, основа diff (программа сравнения файлов, которая выводит различия между двумя файлами) и имеет приложения в биоинформатике.

Примеры:
LCS для входных последовательностей «ABCDGH» и «AEDFHR» — это «ADH» длины 3.
LCS для входных последовательностей «AGGTAB» и «GXTXAYB» — это «GTAB» длины 4.

Пусть входными последовательностями являются X [0..m-1] и Y [0..n-1] длин m и n соответственно. И пусть L (X [0..m-1], Y [0..n-1]) будет длиной LCS двух последовательностей X и Y. Ниже приводится рекурсивное определение L (X [0 .. m-1], Y [0..n-1]).

Если последние символы обеих последовательностей совпадают (или X [m-1] == Y [n-1]), то
L (X [0..m-1], Y [0..n-1]) = 1 + L (X [0..m-2], Y [0..n-2])

Если последние символы обеих последовательностей не совпадают (или X [m-1]! = Y [n-1]), то
L (X [0..m-1], Y [0..n-1]) = MAX (L (X [0..m-2], Y [0..n-1]), L ( X [0..m-1], Y [0..n-2])

/ * Наивная рекурсивная реализация проблемы LCS в Java * /

public class LongestCommonSubsequence {

  

    / * Возвращает длину LCS для X [0..m-1], Y [0..n-1] * /

    int lcs(char[] X, char[] Y, int m, int n)

    {

        if (m == 0 || n == 0)

            return 0;

        if (X[m - 1] == Y[n - 1])

            return 1 + lcs(X, Y, m - 1, n - 1);

        else

            return max(lcs(X, Y, m, n - 1), lcs(X, Y, m - 1, n));

    }

  

    / * Функция полезности для получения максимум 2 целых чисел * /

    int max(int a, int b)

    {

        return (a > b) ? a : b;

    }

  

    public static void main(String[] args)

    {

        LongestCommonSubsequence lcs = new LongestCommonSubsequence();

        String s1 = "AGGTAB";

        String s2 = "GXTXAYB";

  

        char[] X = s1.toCharArray();

        char[] Y = s2.toCharArray();

        int m = X.length;

        int n = Y.length;

  

        System.out.println("Length of LCS is"

                           + " " + lcs.lcs(X, Y, m, n));

    }

}

  
// Этот код предоставлен Сакет Кумар

Выход:

Length of LCS is 4

Ниже приведена табличная реализация проблемы LCS.

/ * Динамическое программирование Java реализация проблемы LCS * /

public class LongestCommonSubsequence {

  

    / * Возвращает длину LCS для X [0..m-1], Y [0..n-1] * /

    int lcs(char[] X, char[] Y, int m, int n)

    {

        int L[][] = new int[m + 1][n + 1];

  

        / * Следуя шагам, соберите L [m + 1] [n + 1] снизу вверх. Заметка

         что L [i] [j] содержит длину LCS из X [0..i-1] и Y [0..j-1] * /

        for (int i = 0; i <= m; i++) {

            for (int j = 0; j <= n; j++) {

                if (i == 0 || j == 0)

                    L[i][j] = 0;

                else if (X[i - 1] == Y[j - 1])

                    L[i][j] = L[i - 1][j - 1] + 1;

                else

                    L[i][j] = max(L[i - 1][j], L[i][j - 1]);

            }

        }

        return L[m][n];

    }

  

    / * Функция полезности для получения максимум 2 целых чисел * /

    int max(int a, int b)

    {

        return (a > b) ? a : b;

    }

  

    public static void main(String[] args)

    {

        LongestCommonSubsequence lcs = new LongestCommonSubsequence();

        String s1 = "AGGTAB";

        String s2 = "GXTXAYB";

  

        char[] X = s1.toCharArray();

        char[] Y = s2.toCharArray();

        int m = X.length;

        int n = Y.length;

  

        System.out.println("Length of LCS is"

                           + " " + lcs.lcs(X, Y, m, n));

    }

}

  
// Этот код предоставлен Сакет Кумар

Выход:

Length of LCS is 4

Пожалуйста, обратитесь к полной статье о динамическом программировании | Установите 4 (Longest Common Subsequence) для более подробной информации!

Рекомендуемые посты:

Java-программа для самой длинной общей подпоследовательности

0.00 (0%) 0 votes