Hirschberg's algorithm
Algorithm for aligning two sequences
In computer science, Hirschberg's algorithm, named after its inventor, Dan Hirschberg, is a dynamic programming algorithm that finds the optimal sequence alignment between two strings. Optimality is measured with the Levenshtein 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 the Needleman-Wunsch algorithm that uses dynamic programming. Hirschberg's algorithm is commonly used in computational biology to find maximal global alignments of DNA and protein sequences.
01Algorithm information
Hirschberg's algorithm is a generally applicable algorithm for optimal sequence alignment. BLAST and FASTA are suboptimal heuristics. If and
are strings, where
and
, the Needleman-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.
One application of the algorithm is finding sequence alignments of DNA or protein sequences. It is also a space-efficient way to calculate the longest common subsequence between two sets of data such as with the common diff tool.
The Hirschberg algorithm can be derived from the Needleman-Wunsch algorithm by observing that:
- one can compute the optimal alignment score by only storing the current and previous row of the Needleman-Wunsch score matrix;
- if
is the optimal alignment of
, and
is an arbitrary partition of
, there exists a partition
of
such that
.
02Algorithm description
denotes the i-th character of
, where
.
denotes a substring of size
, ranging from the i-th to the j-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
:
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) == 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)In the context of observation (2), assume that is a partition of
. Index
is computed such that
and
.
03Example
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 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 1One starts with the top level call to , which splits the first argument in half:
. The call to
produces the following matrix:
Likewise, generates the following matrix:
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 -5 1 -2 -5 -11]The maximum (shown in bold) appears at ymid = 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.
Sources and credits
This article is adapted from the Wikipedia article “Hirschberg's algorithm”, written by its contributors and licensed under CC BY-SA 4.0. Fathomly has changed the layout, removed citation markers, navigation and maintenance notices, and adjusted punctuation. This adapted version is shared under the same license. For references, see the original article.
Fathomly is not affiliated with or endorsed by the Wikimedia Foundation. Spotted a problem? Tell us.