Алгоритм Хиршберга
В информатике , алгоритм Хиршберга , названный в честь его изобретателя Дэна Хиршберга , представляет собой динамического программирования алгоритм который находит оптимальное выравнивание последовательности между двумя строками . Оптимальность измеряется расстоянием Левенштейна , определяемым как сумма затрат на вставки, замены, удаления и нулевые действия, необходимые для замены одной строки на другую. Алгоритм Хиршберга просто описывается как более компактная версия алгоритма Нидлмана-Вунша , который использует разделяй и властвуй . [ 1 ] Алгоритм Хиршберга обычно используется в вычислительной биологии для поиска максимального глобального выравнивания последовательностей ДНК и белков .
Информация об алгоритме
[ редактировать ]Алгоритм Хиршберга является общеприменимым алгоритмом оптимального выравнивания последовательностей. BLAST и FASTA — неоптимальные эвристики . Если и представляют собой строки, где и алгоритм Нидлмана-Вунша находит оптимальное выравнивание в время, используя космос. Алгоритм Хиршберга представляет собой умную модификацию алгоритма Нидлмана-Вунша, который по-прежнему требует время, а нужно только пространстве и на практике работает намного быстрее. [ 2 ] Одним из применений алгоритма является поиск выравниваний последовательностей ДНК или белков. Это также экономичный способ вычисления самой длинной общей подпоследовательности между двумя наборами данных, например, с помощью общего инструмента сравнения .
Алгоритм Хиршберга можно получить из алгоритма Нидлмана – Вунша, если заметить, что: [ 3 ]
- можно вычислить оптимальную оценку выравнивания, сохраняя только текущую и предыдущую строку матрицы оценок Нидлмана – Вунша;
- если это оптимальное выравнивание , и является произвольным разбиением , существует раздел из такой, что .
Описание алгоритма
[ редактировать ]обозначает i -й символ , где . обозначает подстроку размера , начиная с i -го и заканчивая j -м символом . это перевернутая версия .
и представляют собой последовательности, подлежащие выравниванию. Позволять быть персонажем из , и быть персонажем из . Мы предполагаем, что , и являются четко определенными целочисленными функциями. Эти функции представляют стоимость удаления , вставка и замена с , соответственно.
Мы определяем , который возвращает последнюю строку матрицы оценок Нидлмана-Вунша :
function NWScore(X, Y) Score(0, 0) = 0 // 2 * (length(Y) + 1) array for j = 1 to length(Y) Score(0, j) = Score(0, j - 1) + Ins(Yj) for i = 1 to length(X) // Init array Score(1, 0) = Score(0, 0) + Del(Xi) for j = 1 to length(Y) scoreSub = Score(0, j - 1) + Sub(Xi, Yj) scoreDel = Score(0, j) + Del(Xi) scoreIns = Score(1, j - 1) + Ins(Yj) Score(1, j) = max(scoreSub, scoreDel, scoreIns) end // Copy Score[1] to Score[0] Score(0, :) = Score(1, :) end for j = 0 to length(Y) LastLine(j) = Score(1, j) return LastLine
Обратите внимание, что в любой момент требуются только две последние строки матрицы оценок. Таким образом, реализуется в космос.
Алгоритм Хиршберга следующий:
function Hirschberg(X, Y) Z = "" W = "" if length(X) == 0 for i = 1 to length(Y) Z = Z + '-' W = W + Yi end else if length(Y) == 0 for i = 1 to length(X) Z = Z + Xi W = W + '-' end else if length(X) == 1 or length(Y) == 1 (Z, W) = NeedlemanWunsch(X, Y) else xlen = length(X) xmid = length(X) / 2 ylen = length(Y) ScoreL = NWScore(X1:xmid, Y) ScoreR = NWScore(rev(Xxmid+1:xlen), rev(Y)) ymid = arg max ScoreL + rev(ScoreR) (Z,W) = Hirschberg(X1:xmid, y1:ymid) + Hirschberg(Xxmid+1:xlen, Yymid+1:ylen) end return (Z, W)
В контексте наблюдения (2) предположим, что является разделом . Индекс вычисляется так, что и .
Пример
[ редактировать ]Позволять
Оптимальное выравнивание определяется выражением
W = AGTACGCA Z = --TATGC-
Действительно, в этом можно убедиться, проследив соответствующую матрицу Нидлмана – Вунша:
T A T G C 0 -2 -4 -6 -8 -10 A -2 -1 0 -2 -4 -6 G -4 -3 -2 -1 0 -2 T -6 -2 -4 0 -2 -1 A -8 -4 0 -2 -1 -3 C -10 -6 -2 -1 -3 1 G -12 -8 -4 -3 1 -1 C -14 -10 -6 -5 -1 3 A -16 -12 -8 -7 -3 1
Каждый начинается с вызова верхнего уровня , который делит первый аргумент пополам: . Звонок в выдает следующую матрицу:
T A T G C 0 -2 -4 -6 -8 -10 A -2 -1 0 -2 -4 -6 G -4 -3 -2 -1 0 -2 T -6 -2 -4 0 -2 -1 A -8 -4 0 -2 -1 -3
Так же, генерирует следующую матрицу:
C G T A T 0 -2 -4 -6 -8 -10 A -2 -1 -3 -5 -4 -6 C -4 0 -2 -4 -6 -5 G -6 -2 2 0 -2 -4 C -8 -4 0 1 -1 -3
Их последние строки (после изменения последнего) и их сумма равны соответственно
ScoreL = [ -8 -4 0 -2 -1 -3 ] rev(ScoreR) = [ -3 -1 1 0 -4 -8 ] Sum = [-11 -5 1 -2 -5 -11]
Максимум (выделен жирным шрифтом) появляется при ymid = 2
, создавая раздел .
Вся рекурсия Хиршберга (которую мы опускаем для краткости) дает следующее дерево:
(AGTACGCA,TATGC) / \ (AGTA,TA) (CGCA,TGC) / \ / \ (AG, ) (TA,TA) (CG,TG) (CA,C) / \ / \ (T,T) (A,A) (C,T) (G,G)
Листья дерева имеют оптимальное расположение.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Алгоритм Хиршберга .
- ^ «Алгоритм» .
- ^ Хиршберг, Д.С. (1975). «Алгоритм линейного пространства для вычисления максимальных общих подпоследовательностей». Коммуникации АКМ . 18 (6): 341–343. CiteSeerX 10.1.1.348.4774 . дои : 10.1145/360825.360861 . МР 0375829 . S2CID 207694727 .