الگوریتم هیرشبرگ: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
بدون خلاصۀ ویرایش |
جز ربات: انتقال رده به درخواست AKhaleghizadeh از رده:فیلوژنتیک رایانشی به رده:تبارزایی رایانشی |
||
(۲۶ نسخهٔ میانی ویرایش شده توسط ۱۲ کاربر نشان داده نشد) | |||
خط ۱:
در [[علوم رایانه]]، '''الگوریتم هیرشبرگ''' {{به انگلیسی|Hirschberg's Algorithm}} [[الگوریتم|الگوریتمی]] برای [[همترازسازی چند توالی|همترازسازی]] بهینهٔ دو [[توالی]] است که دان هیرشبرگ (Dan Hirschberg) در سال ۱۹۷۵ آن را ارائه کرد.
[[پرونده:A linear space algorithm for computing maximal common subsequences.png|جایگزین=A linear space algorithm for computing maximal common subsequences|بندانگشتی|مقالهٔ دان هیرشبرگ که در سال ۱۹۷۵ منتشر شد.]]
در این الگوریتم برای ارزیابی همترازیها از [[فاصله لوناشتاین]] استفاده میشود؛ در همترازی بهینه مجموع هزینههای درج، حذف و جایگزینکردن حروف برای یکسانکردن دو [[رشته (علوم رایانه)|رشته]]، کمینهٔ تمام همترازیهای ممکن است.
[[الگوریتم نیدلمن-وانچ]] یکی از اولین الگوریتمهایی است که برای همترازسازی سراسری دو توالی از [[برنامهریزی پویا|برنامهنویسی پویا]] استفاده میکند. الگوریتم هیرشبرگ در واقع نسخهای از [[الگوریتم نیدلمن-وانچ]] است که با [[الگوریتم تقسیم و حل|تقسیم و حل]] مسئله را حل میکند و مصرف حافظهٔ بهینهتری دارد.<ref>{{یادکرد وب|نویسنده=|کد زبان=|تاریخ=|وبگاه=|نشانی=http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Dynamic/Hirsch/|عنوان=Hirschberg's Algorithm}}</ref>
== ایدههای اصلی ==
هوشمندی الگوریتم هیرشبرگ در استفاده از مشاهدههای زیر است:<ref>{{یادکرد کتاب|عنوان="A linear space algorithm for computing maximal common subsequences"|نام خانوادگی=Hirschberg|نام=.Dan S|ناشر=Communications of the ACM|سال=1975|شابک=|مکان=|صفحات=http://dl.acm.org/citation.cfm?doid=360825.360861}}</ref>
# برای
# اگر <math>(
این الگوریتم از ایدهٔ Savitch در [[نظریه پیچیدگی محاسباتی|نظریهٔ پیچیدگی]] الهام گرفتهاست.<ref>{{یادکرد وب|نویسنده=|کد زبان=|تاریخ=|وبگاه=|نشانی=https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/06DynamicProgrammingII.pdf|عنوان=Dynamic Programming}}</ref>
== امتیازدهی ==
برای
== الگوریتم ==
برای
برای دو حرف x و y که به ترتیب از
=== تابع NWscore ===
[[شبهکد]]:<syntaxhighlight lang="text">
function NWscore(X,Y)
Score(0,0) = 0
for j=1 to length(Y)
سطر ۵۶ ⟵ ۳۰:
Score(i,0) = Score(i-1,0) + Del(Xi)
for j=1 to length(Y)
if( Xi == Yj ) scoreSub = Score(i-1,j-1) +
else scoreSub = Score(i-1,j-1) + Sub(Xi, Yj)
scoreDel = Score(i-1,j) + Del(Xi)
scoreIns = Score(i,j-1) + Ins(Yj)
سطر ۶۵ ⟵ ۴۰:
LastLine(j) = Score(length(X),j)
return LastLine
</syntaxhighlight>
این [[تابع (برنامهنویسی)|تابع]] آخرین سطر از [[ماتریس]] امتیاز [[الگوریتم نیدلمن-وانچ|نیدلمن-وانچ]] را (که معمولاً با F یا score نشان داده میشود) در [[زمان اجرای الگوریتم|زمان]] <math>O(mn)</math> و با حافظهٔ <math>O(mn)</math> محاسبه میکند.
پیادهسازی زیر در [[متلب|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
end
end
</syntaxhighlight>
=== تابع Hirschberg ===
[[شبهکد]]:<syntaxhighlight lang="text">
function Hirschberg(X,Y)
Z = ""
سطر ۱۳۵ ⟵ ۸۸:
end
else if length(X) == 1 or length(Y) == 1
(Z,W) =
else
xlen = length(X)
xmid = length(X)/2
ylen = length(Y)
ScoreL =
ScoreR =
ymid = arg max ScoreL + rev(ScoreR)
(Z,W) = Hirschberg(X1:xmid, y1:ymid) + Hirschberg(Xxmid+1:xlen, Yymid+1:ylen)
end
سطر ۱۵۰ ⟵ ۱۰۳:
</syntaxhighlight>
پیادهسازی
function [
if( isempty(X) )
elseif( isempty(Y) )
elseif( length(X) == 1 || length(Y) == 1 )
[
else
mid1 = floor(length(X) / 2);
[maxScore, mid2] = max(s1 + flip(s2));
mid2 = mid2 - 1;
[temp11, temp21] = Hirschberg(X(1:mid1), Y(1:mid2)
[temp12, temp22] = Hirschberg(X(mid1 + 1:end), Y(mid2 + 1:end)
end
end
</syntaxhighlight>این [[تابع (علوم رایانه)|تابع]] با استفاده از روش [[الگوریتم تقسیم و حل|تقسیم و حل]]، همترازی بهینه و امتیاز این همترازی را بدست میآورد. نحوهٔ پیادهسازی [[تابع (علوم رایانه)|تابع]] NWscore بیان شد و [[تابع (علوم رایانه)|تابع]] NW از [[الگوریتم نیدلمن-وانچ]] استفاده میکند. [[زمان اجرای الگوریتم|زمان اجرا]]ی این [[تابع (علوم رایانه)|تابع]] <math>O(mn)</math> است. دقت کنید که [[الگوریتم نیدلمن-وانچ]] در حالت کلی به <math>O(mn)</math> حافظه نیاز دارد، اما اینجا، تنها درصورتی استفاده شدهاست که طول یکی از [[رشته (علوم رایانه)|رشته]]ها (m یا n) برابر ۱ باشد و در نتیجه با مصرف حافظهٔ خطی اجرا میشود.
[[پرونده:HirschbergsAlgorithm.jpg|جایگزین=الگوریتم هیرشبرگ|وسط|بیقاب|445x445پیکسل|یک مرحله از الگوریتم هیرشبرگ.]]
=== مقایسه با الگوریتم نیدلمن-وانچ ===
الگوریتم هیرشبرگ، مشابه [[الگوریتم نیدلمن-وانچ]]، بهترین امتیاز را با استفاده از [[برنامهریزی پویا|برنامهنویسی پویا]] محاسبه کرده و همترازی متناظر با آن را مییابد.
پیچیدگی زمانی همترازی دو رشته با طولهای m و n در الگوریتم هیرشبرگ <math>O(mn)</math> (مشابه الگوریتم نیدلمن-وانچ) است.
این الگوریتم تنها <math>O(min\{m, n\})</math>حافظه نیاز دارد که بهینهتر از الگوریتم نیدلمن-وانچ (با حافظه <math>O(mn)</math>) است.
== مثال ==
فرض کنید دو [[توالی اسید نوکلئیک|توالی DNA]] بنامهای X و Y و امتیازهای [[همترازسازی چند توالی|همترازسازی]] به صورت زیر باشند:
<math> X = AGTACGCA, Y = TATGC</math>
<math>Del(x) = -2, Ins(y) = -2, Sub(x,y) = -1, Match(x,y) = 2 : for\ x,y\in\{A, C, T, G\}</math>
در اولین مرحلهٔ الگوریتم هیرشبرگ،<math>\operatorname{Hirschberg}(\mathrm{AGTACGCA}, \mathrm{TATGC})</math>فراخوانده میشود که [[رشته (علوم رایانه)|رشته]]ی X را به صورت <math>X = \mathrm{AGTA} + \mathrm{CGCA}</math> تقسیمبندی میکند.
سپس <math>\operatorname{NWscore}(\operatorname{rev}(\mathrm{CGCA}), \operatorname{rev}(Y))</math>فراخوانده میشود که حاصل آن به صورت زیر است:<syntaxhighlight lang="text">
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
</syntaxhighlight>و در نتیجه:<syntaxhighlight lang="text">
ScoreL = [ -8 -4 0 -2 -1 -3 ]
rev(ScoreR) = [ -3 -1 1 0 -4 -8 ]
Sum = [-11 -5 1 -2 -5 -11]
</syntaxhighlight>بیشینهٔ امتیاز در ymid = ۲ است و در نتیجه <math>Y = \mathrm{TA} + \mathrm{TGC}</math> تقسیمبندی بهینهٔ Y است.
به همین ترتیب در هر مرحله زیررشتهها تقسیم شده و همترازی بهینه بدست میآید. درخت زیر خلاصهای از مراحل تقسیمبندی در این مثال را نشان میدهد:<syntaxhighlight lang="text">
(AGTACGCA,TATGC)
/ \
(AGTA,TA) (CGCA,TGC)
/ \ / \
(AG, ) (TA,TA) (CG,TG) (CA,C)
/ \ / \
(T,T) (A,A) (C,T) (G,G)
</syntaxhighlight>برگهای این [[درخت (نظریه گراف)|درخت]]، همترازی بهینه را نشان میدهند که به صورت زیر است:<syntaxhighlight lang="text">
W = AGTACGCA
Z = --TATGC-
</syntaxhighlight>
== کاربرد ==
معمولاً در [[بیوانفورماتیک]] از الگوریتم هیرشبرگ برای [[همترازسازی چند توالی|همترازسازی]] سراسری توالیهای [[زیستشناسی|زیستی]] (توالیهای [[اسید آمینه|آمینواسید]]ی و [[توالی اسید نوکلئیک|توالیهای DNA]]) استفاده میشود. [[بلاست]] (BLAST) و فاستا (FASTA) نمونههای [[الگوریتم جستجوی کاشف|هیوریستیک]] استفاده از آن هستند.
== منابع ==
{{پانویس}}
== پیوند به بیرون ==
* [https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/06DynamicProgrammingII.pdf Dynamic Programming (توضیحات بیشتر درمورد الگوریتم هیرشبرگ و بررسی پیچیدگی زمانی آن)]
* [http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/DynProg/Docs/Hirschberg-LCS-1975.pdf A linear space algorithm for computing maximal common subsequences] {{Webarchive|url=https://web.archive.org/web/20161014235014/http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/DynProg/Docs/Hirschberg-LCS-1975.pdf |date=14 اكتبر 2016 }}
[[رده:الگوریتمهای بیوانفورماتیک]]
[[رده:برنامهنویسی پویا]]
[[رده:بیوانفورماتیک]]
[[رده:علوم رایانه]]
[[رده:تبارزایی رایانشی]]
|