|
|
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Я сравниваю два больших массива чисел, размеры (длины) массивов равны А и В соответственно. Стандартная реализация алгоритма нахождения LCS подразумевает создание матрицы размером A*B. При больших значениях A и B (скажем, по 10000 элементов в массиве) эта матрица "отжирает" невероятно много памяти (сотни мегабайт). Существует ли оптимизация для алгоритма нахождения LCS, уменьшающая затраты памяти, например, в ущерб быстродействию, или стандартный алгоритм с матрицей это единственно возможный путь нахождения LCS? When a movie is over, it's a black ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2011, 19:15 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Квейд, Если времени не жалко, придумать можно много чего. Скажем, взять функцию нахождения общей подпоследовательности для хвостов последовательностей, где воспользоваться тем правилом, что либо общая подпоследовательность содержит первый элемент первого хвоста a 1 , и тогда нас не интересуют элементы второго хвоста до первого b i равного a 1 , либо нас не интересует a 1 . Если во второй последовательности много разных элементов, места должно жраться существенно меньше. Но это всё равно O(A*B) Теоретически, можно ограничиться памятью порядка O(A+B) - создать вектор пар с возможностью одного из элементов пары быть пустым и перебирать все возможные размещения "разреженной" последовательности A "над" разреженной последовательностью B. Но это будет реально долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2011, 19:43 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Посмотрел описание в вики. Если это оно то удивляет наличие нулей по обе стороны от области диагонали. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Можно попробовать объявить эту матрицу "разрежённой" (sparse) и заюзать какие-то библиотеки. Типа Colt. Сам я её юзал только не для матриц а совсем для других вычислений поэтому особо ничего внятно не скажу. Но в анонсе есть заявленая возможность работы http://acs.lbl.gov/software/colt/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2011, 20:00 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2011, 21:07 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 00:33 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, у Квейда произвольная последовательность, насколько я понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 01:40 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
У меня две длинных последовательности (массива), которые в среднем отличаются друг от друга на 5-10% (то есть 5-10% элементов стоят не на своих местах либо изменены, либо удалены, либо добавлены). Я пока экономлю память путем, который подсказал Abstraction: обрезаю "головы" и "хвосты", которые одинаковы для обоих массивов. Однако данные мне массивы могут быть случайно заполненные, то есть может встретиться случай, когда в двух массивах изменены, например, первый и последний элементы. Случай хотя и невероятно редкий, но возможный - и матрица тогда строится полноразмерная, как и без оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 11:44 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 12:33 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Квейд, Могу подкинуть ещё одно соображение. В множестве максимальных подпоследовательностей существует такая 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 и т.д. При сильно похожих последовательностях, может получиться быстро. Но вообще, уже давали ссылку на универсальный алгоритм, жрущий мало памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 12:37 |
|
||
|
Наибольшая общая подпоследовательность (LCS): возможно ли уменьшить затраты памяти?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovmayton, Сорри, тогда это http://en.wikipedia.org/wiki/Hirschberg%27s_algorithm Это очень интересно, сейчас буду курить. Алгоритм Хиршберга заявляет о затрате памяти при вычислении LCS равной O(m+n), в то время как моя реализация Левенштейна требует O(m*n) затрат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2011, 12:47 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1342782]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 471ms |

| 0 / 0 |
