زمان اجرای الگوریتم
در نظریه پیچیدگی محاسباتی و علوم کامپیوتر، پیچیدگی زمانی یا زمان اجرایِ یک الگوریتم مقدار زمانی را توصیف میکند تا الگوریتم اجرا و متوقف شود. به عبارتی دیگر پیچیدگی محاسباتی منابع زمانی الگوریتم است. پیچیدگی زمانی معمولاً با شمارش تعداد عملیاتهای پایهای که الگوریتم انجام میدهد توصیف میشود.
زمان اجرای الگوریتم را معمولاً با نماد
در بسیاری از موارد ورودیهای متفاوت با اندازهٔ یکسان زمان اجرای متفاوتی دارند. در این موارد بدترین حالت یا میانگین این حالات را معیارمان قرار میدهیم (بیشینه یا متوسط میان تمام ورودیهای ممکن به طول
زمان اجرا از مسائل مهم در طراحی الگوریتم است و برای تحلیل و بررسی میزان کارایی الگوریتمها اهمیت دارد. رفتار مجانبی زمان اجرا بیشترین اهمیت را دارد و معمولاً با نمادهای مجانبی توصیف میشود.
تعریف
به شکل دقیق، مقدار char
هایی (مثل صفر و یک) است که به الگوریتم
فرض کنید
معمولاً مدل محاسباتی ذکر نمیشود و به طور پیشفرض RAM فرض میشود.
هر عمل پایه (مثل جمع و ضرب و ...) در یک مدل محاسباتی مقدار یکسانی زمان میبرد و این مقدار (هزینهٔ هر عمل) را واحد زمانی مینامیم. پس زمان اجرای الگوریتم برابر با تعداد اعمال پایهای است که این الگوریتم انجام میدهد. در نتیجه زمان اجرای هر خط کد (که تابع خاصی را صدا نمیزند)
در پردازندههای واقعی هر عمل پایه ممکن است به اندازهٔ متفاوتی طول بکشند (مثلاً عمل ضرب کمی کندتر از عمل جمع است) اما در این مدلها از این تفاوتهای ناچیز صرف نظر میکنیم. در کامپیوترهای امروزی هر واحد زمانی حدوداً معادل یک نانوثانیه است ولی این تقریب با پیشرفت تکنولوژی (در سختافزار) تغییر میکند (قانون مور).
گاهی در مدلهای قدیمی هزینهٔ اعمال پایه واحد در نظر گرفته نمیشد:
- معیار هزینه واحد (پیچیدگی اعمال حسابی) (به انگلیسی: uniform cost criterion): هر عملیات به اندازهٔ یک واحد زمانی (ثابت) هزینه دارد.
- معیار هزینه لگاریتمی (پیچیدگی بیتی) (به انگلیسی: logarithmic cost criterion): هزینهٔ انجام هر عملیات با لگاریتم آن متناسب است. مثلاً جمع دو عدد -بیتیاست.
معیار هزینه لگاریتمی درک و تحلیل الگوریتم را سختتر و سنگینتر میکرد. همچنین در کامپیوترهای امروزی هر عدد در int
یا float
ذخیره میشود و معمولاً ۳۲ یا ۶۴ بیت دارد و اعمال ساده در آنها هزینهٔ ثابتی دارد
در مقابل اعداد قابل ذخیره در int
(هر چند بزرگ) محدود اند
در نتیجه باید تعریفمان از int
را در مدل محاسباتی دقیق کنیم. یک word
دنبالهای از صفرها و یکها است. اگر طول این دنبالهها را ۳۲ فرض کنیم به تعریف int
میرسیم. اگر طولشان را واحد فرض کنیم (بیت) هزینهٔ هر عمل مثل معیار لگاریتمی میشود (مثلاً برای جمع دو عدد BigNum
میرسیم و هزینهٔ هر عمل مثل معیار هزینه واحد میشود.
هر عمل پایه (مثل ۴ عمل اصلی و اعمال بیتی منطقی و ...) بر روی هر word
به اندازهٔ یک واحد زمانی هزینه دارد. طول هر word
و اعمالی که میتوان روی آنها انجام داد بستگی به تعریف خودمان دارد و در هر موقعیت و زمینهای باید انتخاب مناسب انجام داد تا واقعیت را به شکل دقیقتری مدلسازی کند.
بیتوجهی به این موارد از اشتباهات رایج در تحلیل الگوریتم در کتابها و مقالات است. در این موارد با فرض یک مدل خاص، یک کران پایین برای پیچیدگی محاسباتی اثبات میشود و نتیجه گرفته میشود که هیچ الگوریتم سریعتری وجود نخواهد داشت در حالی که آن مدل به خوبی کامپیوترهای واقعی را توصیف نمیکند.
پیچیدگی بیتی
در تحلیل پیچیدگی محاسباتی اعمال ریاضی هدف ما پیدا کردن پیچیدگی محاسبهٔ یک عمل مثل ضرب است و نمیتوانیم صورت مسئله (عمل ضرب word
یکبیتی است و اعمال پایه تنها روی یک بیت اعمال میشوند.
پیچیدگی اعمال حسابی
در این مدل هر word
تعداد بیتهای دلخواهی دارد. در الگوریتمهای محاسبات ماتریسی معمول (مثل روش گاوس) پیچیدگی اعمال حسابی
پیچیدگیهای زمانی متداول
در تحلیل زمانی الگوریتمها به توابع متداولی بر میخوریم که در اینجا به ترتیب نرخ رشدشان به آنها اشاره میشود.
توصیف مجانبی | مشهور به | مثال برای | الگوریتم به عنوان مثال |
---|---|---|---|
زمان ثابت | پیدا کردن میانه در یک آرایهٔ مرتب | ||
معکوس تابع آکرمن | اعمال ادغام و جستجو در DSU | ||
لوگ استار | |||
اعمال معمول در Heap | |||
لگاریتمی | جستجوی دودویی | ||
خطی | پیدا کردن عنصر بیشینه در یک آرایهٔ دلخواه - جستجوی خطی | ||
Merge sort | |||
چندجملهای | Bubble sort | ||
الگوریتم Held–Karp | |||
نمایی | |||
فاکتوریل | حل بیخردانهٔ مسألهٔ فروشندهٔ دورهگرد |
منابع
- ↑ Introduction to the Theory of Computation (3rd edition). به کوشش Michael Sipser.
- ↑ An Introduction to Formal Languages and Automata (6th edition). به کوشش Peter Linz.
- ↑ Introduction to Algorithms (CLRS) (3rd edition). به کوشش Thomas H. Cormen, Charles E. Leiserson, Ronald Rivest, Clifford Stein.
- ↑ Discrete Mathematics and Its Applications (eighth edition). به کوشش Kenneth H. Rosen.
- ↑ The Design and Analysis of Computer Algorithms. به کوشش Alfred V. Aho, John E. Hopcroft, Jeffrey D. Ullman.
- ↑ «the price of abstraction».
- بابا محمودی، رمضان. کتاب طلایی پویندگان دانشگاه تحلیل و طراحی الگوریتمها. تهران:نشر ۱۳۹۰.
- احمدی، احمد. فایل در فایل. چاپ دوم. تهران: نشر۲، ۱۳۷۵