[go: nahoru, domu]

الگوریتم هیرشبرگ: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
ZTayebie (بحث | مشارکت‌ها)
بدون خلاصۀ ویرایش
 
(۲۶ نسخهٔ میانی ویرایش شده توسط ۱۲ کاربر نشان داده نشد)
خط ۱:
در [[علوم رایانه]]، '''الگوریتم هیرشبرگ''' {{به انگلیسی|Hirschberg's Algorithm}} [[الگوریتم|الگوریتمی]] برای [[هم‌ترازسازی چند توالی|هم‌ترازسازی]] بهینهٔ دو [[توالی]] است که دان هیرشبرگ (Dan Hirschberg) در سال ۱۹۷۵ آن را ارائه کرد.
{{Mbox
[[پرونده:A linear space algorithm for computing maximal common subsequences.png|جایگزین=A linear space algorithm for computing maximal common subsequences|بندانگشتی|مقالهٔ دان هیرشبرگ که در سال ۱۹۷۵ منتشر شد.]]
| type = notice
در این الگوریتم برای ارزیابی هم‌ترازی‌ها از [[فاصله لون‌اشتاین]] استفاده می‌شود؛ در هم‌ترازی بهینه مجموع هزینه‌های درج، حذف و جایگزین‌کردن حروف برای یکسان‌کردن دو [[رشته (علوم رایانه)|رشته]]، کمینهٔ تمام هم‌ترازی‌های ممکن است.
| class = ambox-In_use
| image = [[File:Ambox clock.svg|48px|alt=|link=]]
| css = margin: 1px
| text = این {{#ifeq:۱۶دسامبر|بخش|[[راهنما:بخش|بخش]]|{{#switch:{{NAMESPACE}}
| {{ns:0}} = مقاله
| بحث = [[راهنما:صفحه بحث|صفحه بحث]]
| رده‌بندی = [[ویکی‌پدیا:رده‌بندی|رده]]
| راهنما = [[راهنما:فهرست|فهرست]]
| درگاه = [[ویکی‌پدیا:درگاه|درگاه]]
| الگو = [[ویکی‌پدیا:فضای نام الگو|الگو]]
| کاربر = [[ویکی‌پدیا:صفحه‌های کاربری|صفحه کاربری]]
| بحث کاربر = [[ویکی‌پدیا:صفحه‌های کاربری|صفحه بحث کاربری]]
| ویکی‌پدیا = [[ویکی‌پدیا:فضای نام ویکی‌پدیا|صفحه ویکی‌پدیا]]
| بحث ویکی‌پدیا = [[ویکی‌پدیا:فضای نام ویکی‌پدیا|صفحه بحث ویکی‌پدیا]]
}}}} هم‌اکنون برای {{#ifeq:۱۶دسامبر|بخش|مدتی کوتاه|۱۶دسامبر}} '''تحت ویرایش عمده''' است. این برچسب برای جلوگیری از [[راهنما:تعارض ویرایشی|تعارض ویرایشی]] اینجا گذاشته شده‌است، لطفا تا زمانیکه این پیام نمایش داده می‌شود ویرایشی در این {{#ifeq:۱۶دسامبر|بخش|بخش|صفحه}} انجام ندهید.<br>
<small>{{#if:|این پیام در اضافه شده است.|}} این صفحه آخرین‌بار در {{#time:H:i، j F Y|{{REVISIONTIMESTAMP}}}} ({{کوچک}}ساعت هماهنگ جهانی{{پایان کوچک}}) ({{Time ago|{{REVISIONTIMESTAMP}}}}) تغییر یافته‌است؛ لطفا اگر در چند ساعت اخیر [{{fullurl:{{FULLPAGENAME}}|action=history}} ویرایش نشده است]، این الگو را حذف کنید. اگر شما ویرایشگری هستید که این الگو را اضافه کرده است، لطفا مطمئن شوید آن را حذف یا با {{پیوند الگو|در دست ساخت}} جایگزین می‌کنید.</small>
{{#ifeq:{{{category}}}|no||{{#switch:{{NAMESPACE}}
| کاربر
| بحث کاربر = <!-- no category -->
| [[رده:صفحه‌های سخت در دست ویرایش]]}}}}
}} 
در علوم رایانه, الگوریتم هیرشبرگ (به انگلیسی [[:en:Hirschberg's_algorithm|Hirschberg's Algorithm]]) الگوریتمی پویا برای هم‌ترازسازی بهینه‌ی دو رشته است که دان هیرشبرگ (Dan Hirschberg) طی سال‌های ۱۹۷۵ و ۱۹۷۷ آن را ابداع و ارائه کرد. <ref>{{یادکرد وب|نویسنده=|کد زبان=|تاریخ=|وب‌گاه=|نشانی=https://en.wikipedia.org/wiki/Hirschberg%27s_algorithm|عنوان=}}</ref>
 
[[الگوریتم نیدلمن-وانچ]] یکی از اولین الگوریتم‌هایی است که برای هم‌ترازسازی سراسری دو توالی از [[برنامه‌ریزی پویا|برنامه‌نویسی پویا]] استفاده می‌کند. الگوریتم هیرشبرگ در واقع نسخه‌ای از [[الگوریتم نیدلمن-وانچ]] است که با [[الگوریتم تقسیم و حل|تقسیم و حل]] مسئله را حل می‌کند و مصرف حافظهٔ بهینه‌تری دارد.<ref>{{یادکرد وب|نویسنده=|کد زبان=|تاریخ=|وبگاه=|نشانی=http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Dynamic/Hirsch/|عنوان=Hirschberg's Algorithm}}</ref>
در این الگوریتم برای ارزیابی هم‌ترازی‌ها از فاصله لون‌اشتاین استفاده می‌شود; در هم‌ترازی بهینه مجموع هزینه‌های درج, حذف و جایگزین‌کردن حروف برای یکسان‌کردن دو رشته, کمینه‌ی تمام هم‌ترازی‌های ممکن است.
 
الگوریتم نیدلمن-وانچ یکی از اولین الگوریتم‌هایی است که برای هم‌‌‌ترازسازی سراسری دو رشته از برنامه‌نویسی پویا استفاده می‌کند. الگوریتم هیرشبرگ درواقع نسخه‌‌ای از الگوریتم نیدلمن-وانچ است که با تقسیم و حل مساله را حل می‌کند و مصرف حافظه‌ی بهینه‌تری دارد.
 
معمولا در بیوانفورماتیک از الگوریتم هیرشبرگ برای هم‌ترازسازی سراسری رشته‌های زیستی (رشته‌های آمینواسیدی و رشته‌های DNA) استفاده می‌شود.
 
== تشابه با الگوریتم نیدلمن-وانچ ==
الگوریتم هیرشبرگ, مشابه الگوریتم نیدلمن-وانچ, بهترین امتیاز را با برنامه نویسی پویا محاسبه کرده و هم‌ردیفی متناظر با آن را می‌یابد.
 
== ایده‌های اصلی ==
هوشمندی الگوریتم هیرشبرگ در استفاده از مشاهده‌های زیر است:<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>(align1Z, align2W) = OptAlign(Str1X, Str2Y)</math>هم‌ترازی سراسری بهینه‌یبهینهٔ رشته‌های[[رشته Str1(علوم رایانه)|رشته]]های X و Str2Y باشد و <math>Str1X = Str1X^{leftl} + Str1X^{rightr}</math>تقسیم‌بندی دلخواهی از Str1X باشد,باشد، تقسیم بندیتقسیم‌بندی <math>Str2Y = Str2Y^{leftl} + Str2Y^{rightr}</math>از Str2Y وجود دارد که <math>(align1Z, align2W) = OptAlign(Str1X^{leftl}, Str2Y^{leftl}) + OptAlign(Str1X^{rightr}, Str2Y^{rightr})</math>.
این الگوریتم از ایدهٔ Savitch در [[نظریه پیچیدگی محاسباتی|نظریهٔ پیچیدگی]] الهام گرفته‌است.<ref>{{یادکرد وب|نویسنده=|کد زبان=|تاریخ=|وبگاه=|نشانی=https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/06DynamicProgrammingII.pdf|عنوان=Dynamic Programming}}</ref>
 
== امتیازدهی ==
برای محاسبه‌یمحاسبهٔ امتیاز هم‌ترازی (درج و حذف,حذف، جایگزینی و تطابق) از ماتریس‌های[[ماتریس]]های امتیازدهی استفاده می‌شود. برای مثال,مثال، در [[ماتریس]] [[بلوسام|بلوسام-۶۲]], امتیاز جایگزینی آمینواسید‌های[[اسید آمینه|آمینواسید]]های Ala و Trp,Trp، تطابق [[اسید آمینه|آمینواسید]] Ala و حذف [[اسید آمینه|آمینواسید]] Ala,Ala، به ترتیب 3۳-,، 4۴ و 4۴- است.
 
معمولامعمولاً برای امتیازدهی هم‌ترازی‌های آمینواسیدی[[اسید آمینه|آمینواسید]]ی (رشته‌هایتوالی‌های [[پروتئین|پروتئینی]]) از [[بلوسام|ماتریس‌های بلوسام و]] یا [[جهش پذیرفته نقطه‌ای|ماتریس‌های جهش پذیرفته‌یپذیرفتهٔ نقطه‌ای]] استفاده می‌شود.
 
== الگوریتم ==
برای رشته‌ی[[رشته (علوم رایانه)|رشته]]ی مفروض <math>X</math>; <math>X_i</math> حرف i ام این [[رشته (علوم رایانه)|رشته]] (<math>1\leq i\leq length(X)</math>), <math>X_{i:j}</math> زیررشته‌‌یزیررشتهٔ آن از حرف i ام تا j ام و <math>rev(X)</math> رشته‌یرشتهٔ معکوس آن است.
 
برای دو حرف x و y که به ترتیب از رشته‌های[[رشته (علوم رایانه)|رشته]]های X و Y اند;اند؛ امتیاز حذف و درج x, جایگزینی x بادرج y و تطابقجایگزینی x وبا y را به ترتیب برابر <math>Sub(x, y), Ins(xy), Del(x)</math>و <math>Match(x, y)</math>است.
 
=== تابع NWscore ===
تابع <math>NW(X, y)</math>آخرین سطر (LastLine) از ماتریس امتیاز نیدلمن-وانچ (که معمولا با F یا score نشان داده می‌شود) را برمی‌گرداند:<syntaxhighlight>
[[شبه‌کد]]:<syntaxhighlight lang="text">
function NWScore(X,Y)
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) + SubMatch(Xi, Yj)
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>
</syntaxhighlight>این شبه‌کد, آخرین سطر را در زمان <math>O(mn)</math> و با حافظه‌ی <math>O(mn)</math> محاسبه می‌کند.
این [[تابع (برنامه‌نویسی)|تابع]] آخرین سطر از [[ماتریس]] امتیاز [[الگوریتم نیدلمن-وانچ|نیدلمن-وانچ]] را (که معمولاً با F یا score نشان داده می‌شود) در [[زمان اجرای الگوریتم|زمان]] <math>O(mn)</math> و با حافظهٔ <math>O(mn)</math> محاسبه می‌کند.
 
پیاده‌سازی زیر در [[متلب|MATLAB]], با همین زمان[[پیچیدگی زمانی]] ولی با حافظه‌یحافظهٔ <math>O(min\{m, n\})</math> سطر آخرنتیجه را محاسبه می‌کند:<syntaxhighlight lang="matlab">
function [ maxScore, lastLine ] = NWscore( X, Y )
 
scorePrev = zeros(1, length(Y) + 1);
lastLine = zeros(1, length(Y) + 1);
 
for i = 1:length(Y)
scorePrev(i + 1) = scorePrev(i) + scoring(Y(i) - 'A' + 1, end);
end
 
for i = 1:length(X)
lastLine(1) = scorePrev(1) + scoring(end, X(i) - 'A' + 1);
for j = 1:length(Y)
s1 = scorePrev(j) + scoring(X(i) - 'A' + 1, Y(j) - 'A' + 1);
s2 = scorePrev(j + 1) + scoring(end, X(i) - 'A' + 1);
s3 = lastLine(j) + scoring(Y(j) - 'A' + 1, end);
lastLine(j + 1) = max([s1, s2, s3]);
end
scorePrev = lastLine;
end
end
 
 
</syntaxhighlight><syntaxhighlight lang="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
s2scorePrev = scorePrev(j + 1) + Del(X(i))lastLine;
s3 = lastLine(j) + Ins(Y(j));
lastLine(j + 1) = max([s1, s2, s3]);
end
 
scorePrev = lastLine;
end
end
 
</syntaxhighlight>
 
=== تابع Hirschberg ===
تابع Hirschberg هم‌ترازی بهینه دو رشته را پیدا می‌کند:<syntaxhighlight>
[[شبه‌کد]]:<syntaxhighlight lang="text">
function Hirschberg(X,Y)
Z = ""
سطر ۱۳۵ ⟵ ۸۸:
end
else if length(X) == 1 or length(Y) == 1
(Z,W) = NeedlemanWunschNW(X,Y)
else
xlen = length(X)
xmid = length(X)/2
ylen = length(Y)
 
ScoreL = NWScoreNWscore(X1:xmid, Y)
ScoreR = NWScoreNWscore(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
سطر ۱۵۰ ⟵ ۱۰۳:
</syntaxhighlight>
 
پیاده‌سازی این تابع در [[متلب|MATLAB]]:<syntaxhighlight lang="matlab">
function [ align1Z, align2W, maxScore ] = Hirschberg( X, Y )
 
if( isempty(X) )
align1 Z = char(ones(1, length(Y)) * '-');
align2 W = Y;
elseif( isempty(Y) )
align1 Z = X;
align2 W = char(ones(1, length(X)) * '-');
elseif( length(X) == 1 || length(Y) == 1 )
[align1Z, align2W] = 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 Z = [temp11, temp12];
align2 W = [temp21, temp22];
end
 
end
</syntaxhighlight>این [[تابع (علوم رایانه)|تابع]] با استفاده از روش [[الگوریتم تقسیم و حل|تقسیم و حل]]، هم‌ترازی بهینه و امتیاز این هم‌ترازی را بدست می‌آورد. نحوهٔ پیاده‌سازی [[تابع (علوم رایانه)|تابع]] NWscore بیان شد و [[تابع (علوم رایانه)|تابع]] NW از [[الگوریتم نیدلمن-وانچ]] استفاده می‌کند. [[زمان اجرای الگوریتم|زمان اجرا]]ی این [[تابع (علوم رایانه)|تابع]] <math>O(mn)</math> است. دقت کنید که [[الگوریتم نیدلمن-وانچ]] در حالت کلی به <math>O(mn)</math> حافظه نیاز دارد، اما اینجا، تنها درصورتی استفاده شده‌است که طول یکی از [[رشته (علوم رایانه)|رشته]]ها (m یا n) برابر ۱ باشد و در نتیجه با مصرف حافظهٔ خطی اجرا می‌شود.
</syntaxhighlight>
 
[[پرونده:HirschbergsAlgorithm.jpg|جایگزین=الگوریتم هیرشبرگ|وسط|بی‌قاب|445x445پیکسل|یک مرحله از الگوریتم هیرشبرگ.]]
 
=== مقایسه با الگوریتم نیدلمن-وانچ ===
الگوریتم هیرشبرگ، مشابه [[الگوریتم نیدلمن-وانچ]]، بهترین امتیاز را با استفاده از [[برنامه‌ریزی پویا|برنامه‌نویسی پویا]] محاسبه کرده و هم‌ترازی متناظر با آن را می‌یابد.
 
== هزینه‌ی اجرا ==
پیچیدگی زمانی هم‌ترازی دو رشته با طول‌های m و n در الگوریتم هیرشبرگ <math>O(mn)</math> (مشابه الگوریتم نیدلمن-وانچ) است.
 
این الگوریتم تنها <math>O(min\{m, n\})</math>حافظه نیاز دارد که بهینه‌تر از الگوریتم نیدلمن-وانچ (با حافظه <math>O(mn)</math>) است. <ref>{{یادکرد کتابوب|عنواننویسنده=Hirschberg, D. S. (1975). "A linear space algorithm for computing maximal common subsequences".|نامکد خانوادگیزبان=|نامتاریخ=|ناشروبگاه=|سالنشانی=http://www.cs.tau.ac.il/~rshamir/algmb/98/scribe/html/lec02/node10.html|شابک=|مکان=|صفحاتعنوان=http://www.cs.tau.ac.il/~rshamir/algmb/98/scribe/html/lec02/node10.html}}</ref>
 
== مثال ==
فرض کنید دو [[توالی اسید نوکلئیک|توالی 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 }}
 
[[رده:الگوریتم‌های بیوانفورماتیک]]
[[رده:برنامه‌نویسی پویا]]
[[رده:بیوانفورماتیک]]
[[رده:علوم رایانه]]
[[رده:تبارزایی رایانشی]]