Алгоритм Хиршберга - Hirschberg's algorithm

В информатике , алгоритм Иршберга в , названный в честь его изобретателя, Дэн Hirschberg , является динамическим программированием алгоритма , который находит оптимальное выравнивание последовательностей между двумя строками . Оптимальность измеряется расстоянием Левенштейна , которое определяется как сумма затрат на вставки, замены, удаления и нулевые действия, необходимые для преобразования одной строки в другую. Алгоритм Хиршберга просто описывается как более компактная версия алгоритма Нидлмана – Вунша, который использует разделяй и властвуй . Алгоритм Хиршберга обычно используется в вычислительной биологии для поиска максимального глобального выравнивания последовательностей ДНК и белков .

Информация об алгоритме

Алгоритм Хиршберга - это общеприменимый алгоритм для оптимального выравнивания последовательностей. BLAST и FASTA - неоптимальные эвристики . Если x и y - строки, где length ( x ) = n и length ( y ) = m , алгоритм Нидлмана – Вунша находит оптимальное выравнивание за время O ( нм ), используя пространство O ( нм ). Алгоритм Хиршберга - это умная модификация алгоритма Нидлмана – Вунша, который по-прежнему занимает O ( нм ) времени, но требует только O (min { nm }) пространства и на практике работает намного быстрее. Одним из применений алгоритма является поиск выравнивания последовательностей ДНК или белковых последовательностей. Это также компактный способ вычисления самой длинной общей подпоследовательности между двумя наборами данных, например, с помощью инструмента common diff .

Алгоритм Хиршберга можно вывести из алгоритма Нидлмана – Вунша, заметив, что:

  1. можно вычислить оптимальную оценку выравнивания, сохранив только текущую и предыдущую строки матрицы оценок Нидлмана – Вунша;
  2. если это выравнивание оптимальным из , и это произвольное разбиение , существует разбиение на такое , что .

Описание алгоритма

обозначает 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) 

Листья дерева содержат оптимальное выравнивание.

Смотрите также

использованная литература