algorithm
Кратчайшая общая проблема суперсимметрии
Поиск…
Кратчайшая общая проблема суперсимметрии Основная информация
Самая короткая общая суперпоследовательность - проблема, тесно связанная с самой длинной общей подпоследовательью, которую вы можете использовать в качестве внешней функции для этой задачи. Кратчайшая общая проблема суперпоследовательности - проблема, тесно связанная с самой длинной общей проблемой подпоследовательности.
Кратчайшая общая суперсимметрия (scs) является общей суперсимметрией минимальной длины. В кратчайшей общей проблеме суперсимментации заданы две последовательности X и Y , и задача состоит в том, чтобы найти кратчайшую общую суперсимметрию этих последовательностей. В общем, scs не уникален.
Для двух последовательностей X = <x1,...,xm> и Y = <y1,...,yn> последовательность U = <u1,...,uk> является общей суперпоследовательностью X и Y если U - суперпоследовательность как X и Y Другими словами, кратчайшая общая суперпоследовательность строк x и y является кратчайшей строкой z такой, что x и y являются подпоследовательностями z .
Для двух входных последовательностей scs можно легко сформировать из самой длинной общей подпоследовательности (lcs). Например, если X[1..m]=abcbdab и Y[1..n]=bdcaba , Y[1..n]=bdcaba - Z[1..r]=bcba . Вставляя символы не-lcs при сохранении порядка символов, получаем scs: U[1..t]=abdcabdab .
Совершенно очевидно, что r+t=m+n для двух входных последовательностей. Однако для трех или более входных последовательностей это не выполняется. Заметим также, что проблемы lcs и scs не являются двойственными проблемами.
Для более общей проблемы нахождения строки S являющейся суперструной множества строк S1,S2,...,Sl , проблема NP-Complete. Также можно найти хорошие приближения для среднего случая, но не для наихудшего случая.
Пример кратчайшей общей проблемы суперсимметрии:
Сложность времени: O(max(m,n))
Реализация самой короткой общей проблемы суперсимметрии в C #
public class ShortestCommonSupersequence
{
private static int Max(int a, int b)
{
return a > b ? a : b;
}
private static int Lcs(string x, string y, int m, int n)
{
var l = new int[m + 1, n + 1];
for (var i = 0; i <= m; i++)
{
for (var 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];
}
private static int Scs(string x, string y)
{
int m = x.Length, n = y.Length;
int l = Lcs(x, y, m, n);
return m + n - l;
}
public static int Main(string x, string y)
{
return Scs(x, y);
}
}
