powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / нахождении набольшей общей последователности (LCS)
3 сообщений из 3, страница 1 из 1
нахождении набольшей общей последователности (LCS)
    #39485937
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многим надеюсь известна задача о нахождении набольшей общей последователности aka "Longest Common Sequence".
У меня стоит схожая задача но с допонителным ограничением, что должна выдерживатся минималныя длина подпоследователности.
Другими словами если рассматривать 2 последовательности:

1: AGCAGCAGC
2: AGAGAC
то стандартный LCS: |AGAGAC| = 6

Если же внисти ограничение на мин длину подпоследователности = 2
то результат будет уже другой:
1: AG(C)AG(CAGC)
2: AG AG(AC)

|AGAG| = 4

Меня интересует в первуй очередь длинна этой последовательности.
кто видит/знает эфективный алгоритм нахождения этой длины.
...
Рейтинг: 0 / 0
нахождении набольшей общей последователности (LCS)
    #39486027
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реалная задача не из биоинформатики. Но вектор поиска верный и привел пока сюда.
...
Рейтинг: 0 / 0
нахождении набольшей общей последователности (LCS)
    #39488199
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжая тему,
написал вот такой метод.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
public class OnlineTestLCS {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			int r;

			r = FindLCS("ababcababababcabcab", "abcabcabc", 4);
			System.out.printf("LCS %s\n", r);

			r = FindLCS("abababababababab", "ababcabc", 2);
			System.out.printf("LCS %s\n", r);

			r = FindLCS("abababababababab", "abcabccabc", 2);
			System.out.printf("LCS %s\n", r);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

    static int FindLCS(String strA, String strB, int minLength)
    {
        if (strA.length() < strB.length())
            return FindLCS(strB, strA, minLength);

        if (strB.length() == 0)
        	return 0;


        minLength = Math.max(1, minLength);
        int r = 1 + minLength;
    	int[][] ML = new int[r][];
    	for(int i = 0; i < r; i++)
    		ML[i] = new int[strB.length()];

        int length = 0;
    	int[] SL = new int[strB.length()];

    	int m;
        for (int i = 0; i < strA.length(); ++i)
        {
        	// First fill current sequence length
            char chr = strA.charAt(i);
            for (int j = strB.length(); --j > 0;)
            {
                SL[j] = (chr == strB.charAt(j) ? 1 + SL[j - 1] : 0);
            }
            SL[0] = (chr == strB.charAt(0) ? 1 : 0);

            //Update matches
            ML[i % r][minLength - 1] = m = (SL[minLength - 1] == minLength ? minLength : ML[(i + minLength) % r][minLength - 1]);
        	if(length < m)
        	{
        		length = m;
        		if(m == strB.length())
        			return length;
        	}

            for (int j = minLength; j < strB.length(); ++j)
            {
        		// i + minLength == i - 1 : mod r
        		// i - minLength == i + 1 : mod r
            	if(SL[j] == minLength)
            	{
            		m = minLength + ML[(i + 1) % r][j - minLength];
            	}
            	else if(SL[j] > minLength)
            	{
            		m = Math.max(1 + ML[(i - 1) % r][j - 1], minLength + ML[(i + 1) % r][j - minLength]);
            	}
            	else
            	{
            		m = Math.max(ML[(i + minLength) % r][j], ML[i % r][j - 1]);
            	}
            	ML[i % r][j] = m;
            	if(length < m)
            	{
            		length = m;
            		if(m == strB.length())
            			return length;
            	}
            }
        }
        return length;
    }

}




Работает но медленно. Сложность O(n*m) где n и m размерности строк.

Собственно зачем мне нужна эта функция.
У меня есть К шаблонов и мне необходимо для одной строки найти наиболее подходящий из них.
Как критерий подходящего выбирается шаблон с максималной длинной общей последователности.
Строка берётся из файла и всё это в цикле.
получается для каждой строки и для каждого шаблона необчодимо вычислять длинну максималной обшей последователности.
Уже при 60 шаблонах обработка 80 Килобайтного файла занимает ... а у меня бсего 600 МБ этих файлов.

Какие будут мысли у сообшества по оптимизации алгоритма?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / нахождении набольшей общей последователности (LCS)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]