Incomputer science,Hirschberg's algorithm, named after its inventor,Dan Hirschberg, is adynamic programmingalgorithm that finds the optimalsequence alignment between twostrings. Optimality is measured with theLevenshtein distance, defined to be the sum of the costs of insertions, replacements, deletions, and null actions needed to change one string into the other. Hirschberg's algorithm is simply described as a more space-efficient version of theNeedleman–Wunsch algorithm that usesdynamic programming.[1] Hirschberg's algorithm is commonly used incomputational biology to find maximal global alignments ofDNA andprotein sequences.
Hirschberg's algorithm is a generally applicable algorithm for optimal sequence alignment.BLAST andFASTA are suboptimalheuristics. If and are strings, where and, theNeedleman–Wunsch algorithm finds an optimal alignment in time, using space. Hirschberg's algorithm is a clever modification of the Needleman–Wunsch Algorithm, which still takes time, but needs only space and is much faster in practice.[2]One application of the algorithm is finding sequence alignments of DNA or protein sequences. It is also a space-efficient way to calculate thelongest common subsequence between two sets of data such as with the commondiff tool.
The Hirschberg algorithm can be derived from the Needleman–Wunsch algorithm by observing that:[3]
denotes thei-th character of, where. denotes a substring of size, ranging from thei-th to thej-th character of. is the reversed version of.
and are sequences to be aligned. Let be a character from, and be a character from. We assume that, and are well defined integer-valued functions. These functions represent the cost of deleting, inserting, and replacing with, respectively.
We define, which returns the last line of the Needleman–Wunsch score matrix:
function NWScore(X, Y) Score(0, 0) = 0 // 2 * (length(Y) + 1) arrayfor j = 1to length(Y) Score(0, j) = Score(0, j - 1) + Ins(Yj)for i = 1to length(X) // Init array Score(1, 0) = Score(0, 0) + Del(Xi)for j = 1to 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, :)endfor j = 0to length(Y) LastLine(j) = Score(1, j)return LastLine
Note that at any point, only requires the two most recent rows of the score matrix. Thus, is implemented in space.
The Hirschberg algorithm follows:
function Hirschberg(X, Y) Z = "" W = ""if length(X) == 0for i = 1to length(Y) Z = Z + '-' W = W + Yiendelse if length(Y) == 0for i = 1to length(X) Z = Z + Xi W = W + '-'endelse if length(X) == 1or 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)endreturn (Z, W)
In the context of observation (2), assume that is a partition of. Index is computed such that and.
Let
The optimal alignment is given by
W = AGTACGCA Z = --TATGC-
Indeed, this can be verified by backtracking its corresponding Needleman–Wunsch matrix:
T A T G C0 -2 -4 -6 -8 -10A-2 -1 0 -2 -4 -6G-4 -3 -2 -1 0 -2T -6-2 -4 0 -2 -1A -8 -40 -2 -1 -3C -10 -6 -2-1 -3 1G -12 -8 -4 -31 -1C -14 -10 -6 -5 -13A -16 -12 -8 -7 -31
One starts with the top level call to, which splits the first argument in half:. The call to produces the following matrix:
T A T G C 0 -2 -4 -6 -8 -10A -2 -1 0 -2 -4 -6G -4 -3 -2 -1 0 -2T -6 -2 -4 0 -2 -1A -8 -4 0 -2 -1 -3
Likewise, generates the following matrix:
C G T A T 0 -2 -4 -6 -8 -10A -2 -1 -3 -5 -4 -6C -4 0 -2 -4 -6 -5G -6 -2 2 0 -2 -4C -8 -4 0 1 -1 -3
Their last lines (after reversing the latter) and sum of those are respectively
ScoreL = [ -8 -4 0 -2 -1 -3 ] rev(ScoreR) = [ -3 -1 1 0 -4 -8 ] Sum = [-11 -51 -2 -5 -11]
The maximum (shown in bold) appears atymid = 2, producing the partition.
The entire Hirschberg recursion (which we omit for brevity) produces the following tree:
(AGTACGCA,TATGC) / \ (AGTA,TA) (CGCA,TGC) / \ / \ (AG, ) (TA,TA) (CG,TG) (CA,C) / \ / \ (T,T) (A,A) (C,T) (G,G)
The leaves of the tree contain the optimal alignment.