powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
11 сообщений из 11, страница 1 из 1
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37396528
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сравниваю два больших массива чисел, размеры (длины) массивов равны А и В соответственно.
Стандартная реализация алгоритма нахождения LCS подразумевает создание матрицы размером A*B.
При больших значениях A и B (скажем, по 10000 элементов в массиве) эта матрица "отжирает" невероятно много памяти (сотни мегабайт).


Существует ли оптимизация для алгоритма нахождения LCS, уменьшающая затраты памяти, например, в ущерб быстродействию, или стандартный алгоритм с матрицей это единственно возможный путь нахождения LCS?

When a movie is over, it's a black
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37396565
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Если времени не жалко, придумать можно много чего. Скажем, взять функцию нахождения общей подпоследовательности для хвостов последовательностей, где воспользоваться тем правилом, что либо общая подпоследовательность содержит первый элемент первого хвоста a 1 , и тогда нас не интересуют элементы второго хвоста до первого b i равного a 1 , либо нас не интересует a 1 . Если во второй последовательности много разных элементов, места должно жраться существенно меньше. Но это всё равно O(A*B)
Теоретически, можно ограничиться памятью порядка O(A+B) - создать вектор пар с возможностью одного из элементов пары быть пустым и перебирать все возможные размещения "разреженной" последовательности A "над" разреженной последовательностью B. Но это будет реально долго.
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37396576
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел описание в вики. Если это оно то удивляет наличие нулей по обе стороны от области диагонали.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
     |  0   1   2   3   4   5   6   7 
     |   M Z J A W X U
-----|-----------------
 0     |  0   0   0   0   0   0   0   0 
 1   X |  0   0   0   0   0   0   1   1 
 2   M |  0   1   1   1   1   1   1   1 
 3   J |  0   1   1   2   2   2   2   2 
 4   Y |  0   1   1   2   2   2   2   2 
 5   A |  0   1   1   2   3   3   3   3 
 6   U |  0   1   1   2   3   3   3   4 
 7   Z |  0   1   2   2   3   3   3   4 

Можно попробовать объявить эту матрицу "разрежённой" (sparse) и заюзать какие-то библиотеки.
Типа Colt. Сам я её юзал только не для матриц а совсем для других вычислений поэтому
особо ничего внятно не скажу. Но в анонсе есть заявленая возможность работы

http://acs.lbl.gov/software/colt/
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37396648
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПосмотрел описание в вики. Если это оно то удивляет наличие нулей по обе стороны от области диагонали.

там же есть абзац:

авторReduce the required space

If only the length of the LCS is required, the matrix can be reduced to a 2\times \min(n,m) matrix with ease, or to a min(m,n) + 1 vector (smarter) as the dynamic programming approach only needs the current and previous columns of the matrix. Hirschberg's algorithm allows the construction of the optimal sequence itself in the same quadratic time and linear space bounds.[6]
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37398651
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Тут посмотри
http://guildalfa.ru/alsha/node/13
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37398672
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, у Квейда произвольная последовательность, насколько я понял.
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37399139
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня две длинных последовательности (массива), которые в среднем отличаются друг от друга на 5-10% (то есть 5-10% элементов стоят не на своих местах либо изменены, либо удалены, либо добавлены).

Я пока экономлю память путем, который подсказал Abstraction: обрезаю "головы" и "хвосты", которые одинаковы для обоих массивов. Однако данные мне массивы могут быть случайно заполненные, то есть может встретиться случай, когда в двух массивах изменены, например, первый и последний элементы. Случай хотя и невероятно редкий, но возможный - и матрица тогда строится полноразмерная, как и без оптимизации.
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37399290
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Сорри, тогда это
http://en.wikipedia.org/wiki/Hirschberg%27s_algorithm
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37399307
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Могу подкинуть ещё одно соображение.
В множестве максимальных подпоследовательностей существует такая C , что для любых c t , c t+1 , c t+2 , соответствующих a i , a j , a k ; b l , b m , b n , между b l и b n не существует элемента, равного какому-либо из находящихся между a i и a j .
Таким образом, если для очередного кандидата последний найденный элемент соответствует паре (a i , b l ), то следующий элемент либо a i+1 в паре с первым равным ему после b l b x , либо a i+2 , но уже при условии, что соответствующий ему b y предшествует b x либо a i+3 , но если соответствующий ему b z предшествует b y и b x и т.д. При сильно похожих последовательностях, может получиться быстро.

Но вообще, уже давали ссылку на универсальный алгоритм, жрущий мало памяти.
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37399342
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovmayton,

Сорри, тогда это
http://en.wikipedia.org/wiki/Hirschberg%27s_algorithm Это очень интересно, сейчас буду курить. Алгоритм Хиршберга заявляет о затрате памяти при вычислении LCS равной O(m+n), в то время как моя реализация Левенштейна требует O(m*n) затрат.
...
Рейтинг: 0 / 0
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
    #37399867
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstraction, спасибо за идею
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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