بزرگترین زیردنباله مشترک
بزرگترین زیردنباله مشترک (به انگلیسی: Longest Common Subsequence)، روشی است که برای پیدا کردن بزرگترین زیردنباله در مجموعهای از دنبالهها (غالباً دو دنباله) به کار میرود و مسالهای قدیمی در علم کامپیوتر است و همین طور اساس کار برنامههای مقایسه کننده فایل است که تفاوت دو فابل را نمایش میدهد. همین طور در بیوانفورماتیک برای مقایسه رشتههای دی ان ای کاربرد دارد.
محتویات |
شرح مساله [ویرایش]
دو رشته زیر را در نظر بگیرید:


هدف مقایسه این دو رشته و پیدا کردن شباهت بین آنها است. بزرگترین زیردنباله مشترک این طور تعریف میشود که دنبالهای مانند
است به طوری که حروف موجود در
با حفظ ترتیب در
و
موجود باشد. اما مطلقاً لزومی ندارد که متوالی باشد. از طرفی
باید بزرگترین دنباله ممکن با خواص بالا باشد. به طور کلی اگر دو رشته
و
را در نظر بگیریم٫ یک بلندترین زیر دنباله مشترک را میتوان با استفاده از برنامه نویسی پویا پیدا کرد.
راه حل برای دو دنباله [ویرایش]
مساله LCS دارای خصوصیت زیر ساختار بهینه (Optimal Substructure) است:
مساله LCS را میتوان به زیر مسالههای کوچکتر تقسیم نمود.
که این زیر مسالهها جفت دنبالههای پیشوندی دو دنباله ورودی هستند. اگر داشته باشیم:
٫ آن گاه
به این صورت تعریف میشود: 
فرض کنید
و
دو رشته باشند و
بلندترین زیردنباله مشترک یا LCS دو رشته Y و X باشند. پیاده سازی الگوریتم با استفاده از روش برنامه نویسی پویا به این صورت است:
۱)اگر
باشد٫ آن گاه
و
یک LCS برای
و
است.
۲)اگر
باشد٫ آن گاه
نتیجه میدهد که Z یک LCS برای
و
است.
۳)اگر
باشد٫ آن گاه
نتیجه میدهد که Z یک LCS برای
و
است.
قضیه فوق نشان میدهد: LCS دو رشته٫ در داخل خودش٫ حاوی یک LCS برای پیشوندهای آن دو رشته نیز میباشد.
یک راه حل بازگشتی برای پیداکردن LCS [ویرایش]
فرض کنید
یک عنصر از آرایه C باشد که نشان دهنده طول LCS دو دنباله
و
است. بنابراین اگر i=0 یا j=0 باشد٫ یکی از دنبالهها دارای طول صفر است و در نتیجه LCS دو دنباله صفر خواهد شد.
بنابراین وقتی که
باشد٫ زیر مساله ما پیدا کردن LCS برای
و
است. در غیر این صورت ما دو زیر مساله داریم:
پیدا کردن LCS برای
و
و
پیدا کردن LCS برای
و 
االگوریتم را با استفاده از روش برنامه نویسی پویا پیاده سازی میکنیم. الگوریتم دو رشته
و
را به عنوان ورودی دریافت میکند(شکل ۲). الگوریتم مقادیر
که نشان دهدنده طول LCS است را داخل آرایه
ذخیره میکند. عناصر آرایه به ترتیب row-major پر میشوند. یهنی ابتدا اولین سطر c به ترتیب از چپ به راست پر میشود، سپس سطر دوم و الی آخر. علاوه بر این الگوریتم آرایه دیگری به نام
را نیز پر میکند. این آرایه جهت حرکت را ذخیره میکند.
مقدار b با علامتهای جهت
پر میشود. همین طور مقدار
به این بستگی دارد که آیا
باشد (خط ۹). جهت فلشها طوری انتخاب میشود که همواره حرکت به سمت خانهای با طول LCS بزرکتر را تضمین میکند. در نهایت برای پیدا کردن LCS از گوشه سمت راست و پایین آرایه b در جهت پیکانها به سمت گوشه بالا و چپ آرایه حرکت میکنیم.
function print_LCS (b,X,i,j)
if i=0 or j=0 then
return
if b[i,j] = '
' then
print_LCS(b,X,i-1,j-1)
print
else if b[i,j]= '
' then
print_LCS(b,X,i,j-1)
else print_LCS(b,X,i,j-1)
پیچیدگی زمانی [ویرایش]
زمانی که تعداد دنبالههای ورودی ثابت باشند٫ این مساله توسط برنامه نویسی پویا در زمان چندجملهای حل میشود. فرض کنید N دنباله ورودی به طول
داشته باشیم. یک راه حل ابتدایی برای جستجوی LCS این است که هر یک از
زیردنباله دنباله اولی را برررسی کنیم که آیا زیر دنباله برای دیگر دنبالههای ورودی است یا خیر. هر زیر ددنباله در زمانی خطی متناسب با طول دنبالههای باقی مانده بررسی میشود. بنابراین زمان الگوریتم برابر خواهد بود با:
برای حالت ورودی با دو دنباله با n و m عنصر٫ پیچیدگی زمانی الگوریتم برابر
خواهد بود. برای تعداد ورودیهای دلخواه برنامه نویسی پویا راه حلی با این زمان ارایه میکند:
توابعی با پیچیدگی کمتر موجود است،[۱]
پانویسها [ویرایش]
- ↑ L. Bergroth and H. Hakonen and T. Raita. A Survey of Longest Common Subsequence Algorithms. . SPIRE (IEEE Computer Society) 00 (2000): 39–48.
منابع [ویرایش]
- مشارکتکنندگان ویکیپدیا، «Longest common subsequence problem»، ویکیپدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۱۸ می۲۰۰۹).
- دکتر جم زاد، منصور. جزوه درسی ساختمان داده و الگوریتم ها٫ نسخه ویرایش نشده. تهران: دانشگاه صنعتی شریف، ۱۳۸۵.
- توماس اچ کورمن, Charles E. Leiserson, Ronald L. Rivest and کلیفورد استین. “۱۵٫۴”. In مقدمهای بر الگوریتمها. second ed. MIT Press and McGraw-Hill, 2001. 350–355. ISBN 0-262-53196-8.
' then
print_LCS(b,X,i-1,j-1)
print
else if b[i,j]= '
' then
print_LCS(b,X,i,j-1)
else print_LCS(b,X,i,j-1)