الگوریتم هیرشبرگ
این مقاله هماکنون برای ۱۶دسامبر تحت ویرایش عمده است. این برچسب برای جلوگیری از تعارض ویرایشی اینجا گذاشته شدهاست، لطفا تا زمانیکه این پیام نمایش داده میشود ویرایشی در این صفحه انجام ندهید. این صفحه آخرینبار در ۱۵:۵۴، ۱۵ دسامبر ۲۰۱۶ (ساعت هماهنگ جهانی) (۷ سال پیش) تغییر یافتهاست؛ لطفا اگر در چند ساعت اخیر ویرایش نشده است، این الگو را حذف کنید. اگر شما ویرایشگری هستید که این الگو را اضافه کرده است، لطفا مطمئن شوید آن را حذف یا با {{در دست ساخت}} جایگزین میکنید. |
در علوم رایانه, الگوریتم هیرشبرگ (به انگلیسی Hirschberg's Algorithm) الگوریتمی پویا برای همترازسازی بهینهی دو توالی است که دان هیرشبرگ (Dan Hirschberg) طی سالهای ۱۹۷۵ و ۱۹۷۷ آن را ابداع و ارائه کرد. [۱]
در این الگوریتم برای ارزیابی همترازیها از فاصله لوناشتاین استفاده میشود; در همترازی بهینه مجموع هزینههای درج, حذف و جایگزینکردن حروف برای یکسانکردن دو رشته, کمینهی تمام همترازیهای ممکن است.
الگوریتم نیدلمن-وانچ یکی از اولین الگوریتمهایی است که برای همترازسازی سراسری دو توالی از برنامهنویسی پویا استفاده میکند. الگوریتم هیرشبرگ درواقع نسخهای از الگوریتم نیدلمن-وانچ است که با تقسیم و حل مساله را حل میکند و مصرف حافظهی بهینهتری دارد.
معمولا در بیوانفورماتیک از الگوریتم هیرشبرگ برای همترازسازی سراسری توالیهای زیستی (توالیهای آمینواسیدی و توالیهای DNA) استفاده میشود.
تشابه با الگوریتم نیدلمن-وانچ
الگوریتم هیرشبرگ, مشابه الگوریتم نیدلمن-وانچ, بهترین امتیاز را با استفاده از برنامه نویسی پویا محاسبه کرده و همترازی متناظر با آن را مییابد.
ایدههای اصلی
هوشمندی الگوریتم هیرشبرگ در استفاده از مشاهدههای زیر است:
- برای محاسبهی امتیاز (یا فاصلهی) بهینهی همترازی, کافی است سطر قبلی و سطر جاری را ذخیره کرد (و نه کل سطور ماتریس امتیاز نیدلمن-وانچ).
- اگر همترازی سراسری بهینهی رشتههای Str1 و Str2 باشد و تقسیمبندی دلخواهی از Str1 باشد, تقسیم بندی از Str2 وجود دارد که .
امتیازدهی
برای محاسبهی امتیاز همترازی (درج و حذف, جایگزینی و تطابق) از ماتریسهای امتیازدهی استفاده میشود. برای مثال, در ماتریس بلوسام-۶۲, امتیاز جایگزینی آمینواسیدهای Ala و Trp, تطابق آمینواسید Ala و حذف آمینواسید Ala, به ترتیب 3-, 4 و 4- است.
معمولا برای امتیازدهی همترازیهای آمینواسیدی (توالیهای پروتئینی) از ماتریسهای بلوسام و یا ماتریسهای جهش پذیرفتهی نقطهای استفاده میشود.
الگوریتم
برای رشتهی مفروض ; حرف i ام این رشته ( ), زیررشتهی آن از حرف i ام تا j ام و رشتهی معکوس آن است.
برای دو حرف x و y که به ترتیب از رشتههای X و Y اند; امتیاز حذف x, درج y, جایگزینی x با y و تطابق x و y به ترتیب برابر و است.
تابع آخرین سطر از ماتریس امتیاز نیدلمن-وانچ (که معمولا با F یا score نشان داده میشود) را برمیگرداند:
function NWScore(X,Y)
Score(0,0) = 0
for j=1 to length(Y)
Score(0,j) = Score(0,j-1) + Ins(Yj)
for i=1 to length(X)
Score(i,0) = Score(i-1,0) + Del(Xi)
for j=1 to length(Y)
scoreSub = Score(i-1,j-1) + Sub(Xi, Yj)
scoreDel = Score(i-1,j) + Del(Xi)
scoreIns = Score(i,j-1) + Ins(Yj)
Score(i,j) = max(scoreSub, scoreDel, scoreIns)
end
end
for j=0 to length(Y)
LastLine(j) = Score(length(X),j)
return LastLine
این شبهکد, آخرین سطر ماتریس را در زمان و با حافظهی محاسبه میکند. پیادهسازی زیر در MATLAB, با همین پیچیدگی زمانی ولی با حافظهی نتیجه را محاسبه میکند:
function [ lastLine ] = NWscore( X, Y )
% assume length(Y) <= length(X)
scorePrev = zeros(1, length(Y) + 1);
lastLine = zeros(1, length(Y) + 1);
for i = 1:length(Y)
scorePrev(i + 1) = scorePrev(i) + Ins(Y(i));
end
for i = 1:length(X)
lastLine(1) = scorePrev(1) + Del(X(i));
for j = 1:length(Y)
if( X(i) == Y(j) ) s1 = scorePrev(j) + Match(X(i), Y(j));
else s1 = scorePrev(j) + Sub(X(i), Y(j));
end
s2 = scorePrev(j + 1) + Del(X(i));
s3 = lastLine(j) + Ins(Y(j));
lastLine(j + 1) = max([s1, s2, s3]);
end
scorePrev = lastLine;
end
end
تابع Hirschberg همترازی بهینه دو رشته را پیدا میکند:
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)
پیادهسازی این تابع در MATLAB:
function [ align1, align2, maxScore ] = Hirschberg( X, Y )
if( isempty(X) )
align1 = char(ones(1, length(Y)) * '-');
align2 = Y;
elseif( isempty(Y) )
align1 = X;
align2 = char(ones(1, length(X)) * '-');
elseif( length(X) == 1 || length(Y) == 1 )
[align1, align2] = NW(X, Y, scoring);
else
mid1 = floor(length(X)/2);
[~, s1] = NWscore(X(1:mid1), Y, scoring);
[~, s2] = NWscore(flip(X(mid1 + 1:end)), flip(Y), scoring);
[maxScore, mid2] = max(s1 + flip(s2));
mid2 = mid2 - 1;
[temp11, temp21] = Hirschberg(X(1:mid1), Y(1:mid2), scoring);
[temp12, temp22] = Hirschberg(X(mid1 + 1:end), Y(mid2 + 1:end), scoring);
align1 = [temp11, temp12];
align2 = [temp21, temp22];
end
end
هزینهی اجرا
پیچیدگی زمانی همترازی دو رشته با طولهای m و n در الگوریتم هیرشبرگ (مشابه الگوریتم نیدلمن-وانچ) است.
این الگوریتم تنها حافظه نیاز دارد که بهینهتر از الگوریتم نیدلمن-وانچ (با حافظه ) است. [۲]
منابع
- ↑ https://en.wikipedia.org/wiki/Hirschberg%27s_algorithm. پارامتر
|عنوان= یا |title=
ناموجود یا خالی (کمک) - ↑ Hirschberg, D. S. (1975). "A linear space algorithm for computing maximal common subsequences".