برای یافتن یک رکورد در یک لیست مرتب می‌توان هم از جستجوی دودویی و هم از جستجوی خطی (که در راهکار خود ترتیب را درنظر نمی‌گیرد) استفاده کرد. بررسی دو الگوریتم نتیجه می‌دهد که برای یک لیست به طول *n* اولی در n<log2 و دومی در n عملیات انجام می‌شود. به‌عنوان مثال برای یافتن رکورد *"Morin, Arthur"* است که با جستجوی دودویی در ۵ مرحله و با جستجوی خطی در ۲۸ مرحله یافت می‌شود.
نمودار توابع عموماً در تحلیل الگوریتم‌ها به‌کار می‌روند, در اینجا رابطهٔ میان تعداد عملیات *N* و اندازهٔ ورودی *n* به تصویر کشیده شده‌است.
موضوع **تحلیل الگوریتم‌ها** تعیین میزان منابعی است که برای اجرای هر الگوریتم لازم است. منابعی مثل زمان، حافظه، پهنای باند ارتباطی، یا سخت‌افزار رایانه در نظر گرفته می‌شوند. اکثر الگوریتم‌های طراحی شده برای کار با ورودی‌های با طول اختیاری تولید می‌شوند. کارایی یا پیچیدگی هر الگوریتم را با تابعی نشان می‌دهند که تعداد مراحل لازم برای اجرای الگوریتم را برحسب طول داده ورودی، یا میزان محل‌های گرفته شدهٔ حافظه را بر حسب طول داده ورودی نشان می‌دهد. پیچیدگی زمانی، مقدارپیچیدگی محاسباتی‌ای را توصیف می‌کند که در اجرای یک الگوریتم مصرف می‌شود. غالباً مشاهده می‌شود که یک مسئله را با استفاده از چندین تکنیک مختلف می‌توان حل نمود ولی فقط یکی از آن‌ها به الگوریتمی منجر می‌شود که از بقیه سریعتر است.

در تجزیه و تحلیل نظری الگوریتم آنچه مشترک است، برآورد پیچیدگی در معنای تقریبی آن است. به عنوان مثال، برآورد تابع پیچیدگی برای ورودی خودسرانه بزرگ. نمادهای {\displaystyle {\mathcal {O}},\Theta ,\varOmega } برای این منظور استفاده می‌شوند. مثلاً گفته می‌شود، جستجوی دودویی به اجرا در {\displaystyle \Theta {(logn)}} مرحله تناسب دارد.

معمولاً تخمین‌های تقریبی استفاده می‌شوند، چرا که پیاده‌سازی‌های مختلف از همان الگوریتم، ممکن است در کارایی متفاوت باشد. با این حال بازده هر دو، با «منطق» پیاده‌سازی یک الگوریتم داده شده، ضرب در یک ضریب ثابت به نام ثابت مخفی مرتبط است.

در مورد تحلیل الگوریتم باید در مورد موضوعاتی مانند تابع رشد، روش تحلیل الگوریتم‌های ترتیبی و بازگشتی، حل رابطه‌های بازگشتی ساده، همگن و نا همگن و همچنین تحلیل سرشکنی صحبت کرد.

کارایی الگوریتم
---------------

در نظریه پیچیدگی محاسباتی، الگوریتم‌ها از حیث کارایی در استفاده از منابعی مانند زمان و فضا (حافظه) مورد بررسی قرار می‌گیرند. در این بررسی آنچه اهمیت دارد میزان زمان و فضای مورد نیاز برای حل یک مسئلهٔ خاص نیست بلکه چگونگی افزایش میزان زمان و فضای مورد نیاز با بزرگ شدن ورودی الگوریتم مورد توجه است.

مثلاً فرض کنید دو الگوریتم الف و ب برای حل مسئلهٔ زیر پیشنهاد شده‌اند. در این مسئله نقشهٔ یک منطقه شامل شهرهای قرار گرفته در آن منطقه، جاده‌های بین آن‌ها و طول هر جاده و نیز نام دو شهر مبدأ و مقصد داده شده‌است. هدف پیدا کردن کوتاه‌ترین مسیر از مبدأ به مقصد است.

فرض کنید به صورت تجربی مشاهده کرده‌ایم که اگر تنها یک شهر به تعداد شهرهای نقشه اضافه شود الگوریتم الف به دو برابر زمان برای حل مسئله نیاز دارد در حالی که زمان مورد نیاز برای الگوریتم ب وقتی دو برابر می‌شود که تعداد شهرهای نقشه دو برابر شده باشد. بدیهی است که در چنین شرایطی الگوریتم ب را کاراتر از الگوریتم الف می‌دانیم.

در نظریه پیچیدگی محاسباتی نیز همین روش را پی‌می‌گیریم ولی به جای روش‌های تجربی از روش‌های ریاضی استفاده می‌کنیم. به این منظور ابتدا برای ورودی مسئله یک اندازه تعریف می‌کنیم. این اندازه می‌تواند میزان حافظهٔ مورد نیاز برای ذخیره کردن ورودی مسئله باشد. سپس زمان (یا فضای) مورد نیاز برای حل مسئله توسط یک الگوریتم به صورت تابعی از اندازهٔ مسئله محاسبه می‌شود. به محاسبه یا تقریب زدن این چنین تابعی **تحلیل الگوریتم** گفته می‌شود.

در تحلیل الگوریتم‌ها بهترین، بدترین و متوسط زمان اجرا بررسی می‌شود. هرچند معمولاً بهترین زمان اجرای آن اهمیت ندارد؛ زیرا اساساً به‌ازای ورودی‌های غیر محتمل این حالت رخ می‌دهد. لیکن لازم است الگوریتم‌ها را در بدترین حالت و در صورت امکان در حالت میانگین تحلیل و بررسی کنیم. ممکن است پیچیدگی الگوریتم در یک حالت میانگین بهتر از پیچیدگی‌اش دربدترین حالت باشد و این اطلاعات مفیدی در مورد آن الگوریتم است.

الگوریتم‌ها به دو دسته تقسیم می‌شوند، بازگشتی و ترتیبی. الگوریتم‌های ترتیبی را معمولاً با شمارش دفعات اجرای دستوری که بر اساس اندازه دادهٔ ورودی، بیشترین بار اجرا می‌شود، (در صورتی که زمان اجرای دستور از یک مقدار ثابت تبعیت کند) تحلیل می‌کنیم. اما زمان اجرا و الگوریتم بازگشتی با رابطه‌های بازگشتی بیان می‌شوند. روش‌های مختلفی برای حل این نوع رابطه‌ها داریم. یک روش خوب برای حل رابطه‌های بازگشتی، استفاده از **درخت بازگشتی** است. این روش نحوه جایگذاری یک عبارت بازگشتی و نیز مقدار ثابتی را که در هر سطح از آن عبارت به دست می‌آید، نشان می‌دهد. حاصل جمع مقادیر ثابت تمام سطرها جواب حل بازگشتی است.

برای بررسی خوب بودن یک الگوریتم، باید به آهنگ رشد منحنی زمان اجرا-اندازه ورودی یا میزان حافظه مصرفی-اندازه ورودی توجه کنیم. برای بررسی دقیق‌تر به بررسی شاخص‌های تحلیل الگوریتم و تعریف توابع رشد می‌پردازیم.

### تحلیل زمان اجرای الگوریتم

همان‌طور که در بالا گفته شد، تحلیل الگوریتم به معنای تخمین میزان منابعی است که الگوریتم به آن نیاز دارد. فرض می‌کنیم با یک تک پردازندهٔ عمومی پیاده‌سازی شده با حافظه دسترسی تصادفی (RAM) طرف هستیم و الگوریتم پیاده‌سازی شدهٔ ما توسط برنامهٔ کامپیوتری، عملیات‌ها را هم‌زمان انجام نمی‌دهد. در مدل RAM دستورات تعریف شده‌ای وجود دارند که اجرا کردن‌شان از یک مقدار ثابتی تبعیت می‌کند، دستورهایی که در ساختار کامیپوتر تعبیه شده‌اند: مانند عملگرهای حسابی (جمع و تقسیم و ضرب و غیره)، علمیات‌های انتقال اطلاعات (ذخیره کردن، رونویسی کردن حافظه، بازخوانی حافظه و غیره) و عملیات‌های کنترل (فراخوانی توابع، بازگشتن‌از دستور و غیره).

شبه کد زیر که الگوریتم مرتب‌سازی حبابی را پیاده‌سازی می‌کند در نظربگیرید:

```
for i=1 to A.length
    for j=1 to A.length - i
        if A[j]>A[j+1]
            swap A[j],A[j+1]
```
زمان اجرای الگوریتم، جمع زمان اجرای هر دستوری است که اجرا می‌شود. اگر زمان اجرای هر خط را (که گفتیم مقداری ثابت است) با {\displaystyle c\_{1},c\_{2},c\_{3},c\_{4}} نشان دهیم و اگر {\displaystyle T\_{1},T\_{2},T\_{3},T\_{4}\,} را زمان کل دستورات خط ۱ تا ۴ در نظر بگیریم، زمان اجرای کل برنامه برابر جمع زمان کل اجرای دستورات هر خط می‌شود.

برای خط اول: {\displaystyle {\begin{aligned}&T\_{1}=n.c\_{1}\\\end{aligned}}}

برای خط دوم: {\displaystyle {\begin{aligned}&T\_{2}=\left[1+2+3+\cdots +(n-1)+n\right].c\_{2}=\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{2}\\\end{aligned}}}

برای خط سوم: {\displaystyle {\begin{aligned}&T\_{3}=\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{3}\\\end{aligned}}} و خط چهارم هم در بدترین حالت (اگر هر دفعه وارد if شود) {\displaystyle {\begin{aligned}&T\_{4}=\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{4}\\\end{aligned}}} است. پس زمان اجرای کل برنامه در بدترین حالت:

{\displaystyle f(n)=T\_{1}+T\_{2}+T\_{3}+T\_{4}=nc\_{1}+\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{2}+\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{3}+\left[{\frac {1}{2}}(n^{2}+n)\right]c\_{4}}
است.

طبق تعریفی که در قسمت تابع {\displaystyle {\mathcal {O}}} خواهیم گفت، با وجود داشتن {\displaystyle c=(c\_{1}+c\_{2}+c\_{3}+c\_{4})} و درست بودن رابطه {\displaystyle 0<f(n)<c.n^{2}} برای هر {\displaystyle n>1} خواهیم دید که الگوریتم بالا {\displaystyle {\mathcal {O}}(n^{2})} است.

### میزان ثبات محاسباتی

بنا به تعریف، هر الگوریتمی که نوسان رفتاری کمتری از خود نشان دهد، اصطلاحاً از نظر محاسباتی باثبات‌تر است. نظر به این تعریف، دو موضوع تعیین‌کنندهٔ میزان ثبات محاسباتی الگوریتم خواهند بود:

1. ثبات در مدت زمان اجرا (ثبات زمانی)
2. ثبات در کیفیت جواب نهایی

برای سنجش میزان ثبات زمانی، می‌توان از شاخص {\displaystyle \Delta \_{t+1}} (و یا {\displaystyle \lambda \_{s+1}}) استفاده کرد. مسلماً الگوریتمی از نظر محاسباتی باثبات‌تر است که واریانس {\displaystyle \Delta \_{t+1}}ها کمتر باشد. روش دیگری که می‌توان میزان ثبات زمانی دو یا چند الگوریتم را مقایسه کرد، آن است که با استفاده از آزمون نیکویی بَرازش بررسی کنیم که مقادیر {\displaystyle \Delta \_{t+1}}ها مربوط به کدام الگوریتم، در بازهٔ {\displaystyle (\Delta \_{min},\Delta \_{max})}، به توزیع یکنواخت نزدیک‌تر است.

در این باب چند نکته مدنظر است:

* آزمون نیکویی برازش را می‌بایست سکس کنید و با سطح اطمینان بالا انجام داد و اساساً با اطمینان زیر ۵۰٪ اساساً معنایی ندارد.
* یک عقیده این است که به‌جای بررسی واریانس زمان هر تکرار، واریانس زمان خاتمهٔ الگوریتم را در نظر بگیریم. در این صورت، الگوریتم‌های قطعی، دارای ایده‌آل‌ترین میزان ثبات زمانی هستند، زیرا همیشه مدت زمان اجرای آن‌ها، روی یک سری از داده‌های ورودی معین، یک عدد ثبات است؛ بنابراین، واریانس زمان خاتمهٔ آن‌ها، همواره صفر است.
* اگر یک الگوریتم غیرقطعی را n بار به‌ازای هر یک از شاخص‌های اندازهٔ k و {\displaystyle k+1} اجرا کنیم و میانگین و واریانس زمان خاتمهٔ این الگوریتم غیرقطعی به‌ازای اندازه‌های k و {\displaystyle k+1} به‌ترتیب برابر با {\displaystyle (\mu \_{k},\sigma \_{k}^{2})} و {\displaystyle (\mu \_{k+1},\sigma \_{k+1}^{2})} باشه، به شرطی می‌گوییم این الگوریتم داریا ثبات زمانی است که:

1. ضریب تغییرات زمان خاتمه در همهٔ اندازه‌ها، دارای یک کران بالای ثابت متناهی مانند c باشد (یعنی {\displaystyle \forall \_{k}:\sigma \_{k}/\mu \_{k}\leq c}) و معمولاً {\displaystyle c<0.2} در نظر می‌گیرند.
2. با افزایش اندازه و ابعاد مسئله، واریانس زمان خاتمهٔ الگوریتم حداکثر به صورت خطی رشد کند. به‌عبارت دیگر، {\displaystyle \exists \_{a\_{1},b\_{1}\in \mathbb {R} }:\sigma \_{k+1}^{2}\leq a\_{1}\sigma \_{k}^{2}+b\_{1}}

به‌طور مشابه، برای سنجش میزان ثبات الگوریتم در کیفیت جواب نهایی می‌توان واریانس کیفیت جواب‌های الگوریتم را بعد از چند بار اجرا، اندازه گرفت؛ بنابراین، می‌توان قواعد نکتهٔ قبل را برای این نوع ثبات هم بیان کرد. واضح است که بهترین عملکرید برای ثبات کیفیت جواب نهایی را الگوریتم‌های دقیق دارند.

### نرخ همگرایی

مسلماً هر الگوریتمی که سریع‌تر همگرا شود، مطلوب‌تر است. این نکته دربارهٔ الگوریتم‌ها دقیق کاملاً صادق است اما دربارهٔ الگوریتم‌های تقریبی باید نرخ همگرایی با احتیاط بیشتری بررسی شود. زیرا ممکن است الگوریتم A در مدت زمان کوتاه‌تری در مقایسه با الگوریتم B به یک نقطهٔ بهینهٔ محلی همگرا شود، اما در عوض الگوریتم B به یک جواب بهینهٔ سراسری همگرا شود. برای بررسی همگرایی که به تنهایی خود یک مقولهٔ جداست به تبیین تعاریف زیر می‌پردازیم:

#### الگوریتم همگراشوندهٔ سراسری

اگر الگوریتمی بدین‌صورت باشد که اگر با هر نقطهٔ آغازین دلخواهی شروع شود و در نهایت به یک جواب مشخص برسد، آن را همگراشوندهٔ سراسری می‌نامند. از این نوع الگوریتم‌ها می‌توان به الگوریتم غیر مرکب (سیمپلکس) اشاره کرد.

#### مرتبهٔ همگرایی

فرض کنید الگوریتم A با شروع از جواب اولیهٔ x\_{0}، دنبالهٔ جواب‌های x\_{1}، {\displaystyle x\_{2}}، .... را تا همگرا شدن به جواب {\displaystyle x^{\*}} تولید کند که {\displaystyle x^{\*}} می‌تواند جواب بهینهٔ محلی یا سراسری باشد. به عبارت دیگر، می‌توانیم الگوریتم را معادل یک تابع در نظر بگیریم که:

{\displaystyle x\_{k+1}=A(x\_{k})}

در این صورت مرتبهٔ همگرایی بزرگترین عدد حقیقی نامنفی مانند p است که به‌ازای آن حاصل حد زیر عددی متناهی و نامنفی شود:

{\displaystyle \beta =\lim \_{k\to \infty }{\frac {|x\_{k+1}-x^{\*}|}{|x\_{k}-x^{\*}|^{p}}}}

که در این حال، \beta  را نرخ همگرایی می‌نامیم.

عده‌ای معتقدند که هرچقدر مرتبهٔ همگرایی الگوریتم بزرگتر باشد، با الگوریتم بهتری سروکار داریم؛ زیرا فاصله از جواب حدی {\displaystyle x^{\*}} حداقل در قسمت انتهایی دنبالهٔ جواب‌ها، به اندازهٔ توان pاُم یک قدم، کاسته می‌شود. اما می‌توان به این نظر زمانی که عملکرد الگوریتم از ابتدا تا میانه‌ش دچار تغییرات محسوسی شود ایراداتی وارد کرد.

#### همگرایی خطی

در توضیح بالا اگر {\displaystyle \beta <1} و {\displaystyle p=1}، اصطلاحاً گفته می‌شود که همگرایی الگوریتم **از مرتبهٔ خطی** و با نرخ همگرایی \beta  است. اکنون فرض کنید دنباله جواب‌های الگوریتم به‌صورت خطی است و با نرخ همگرایی \beta  به جواب {\displaystyle x^{\*}} همگرا می‌شود. در این‌صورت، می‌توان گفت که ضریب ثابتی مانند c وجود دارد که نقاط، حداقل با سرعت یک دنبالهٔ هندسی همچون {\displaystyle c\beta ^{k}} به جواب {\displaystyle x^{\*}} همگرا می‌شوند. از این رو در بعضی منابع **همگرایی خطی** را **همگرایی هندسی** نیز می‌نامند.

#### ثبات نرخ همگرایی

ثبات نرخ همگرایی یکی از شاخص‌هایی‌است که با استفاده از واریانس داده‌های ستون شیب همگرایی برای هر الگوریتمی قابل محاسبه‌است. هر الگوریتمی که دارای ثبات در مدت زمان اجرا و ثبات در کیفیت جواب نهایی باشد، دارای ثبات در نرخ همگرایی خواهد بود.

### هوشمندی الگوریتم

یکی از شاخص‌های تحلیل الگوریتم‌ها بحث هوشمندی الگوریتم است. شاید این مقوله تا حد زیاد کیفی به نظر برسد اما بررسی آن خالی از لطف نیست.

این بحث کمی ریشه‌دار تر از زمانی است که مفهوم الگوریتم و تحلیل آن صورت بندی شد و اساساً این مسئلهٔ اساسی مطرح بود که کمال هوشمندی یک الگوریتم چیست؟ آیا قرابت آن به فکر و استدلال نشانهٔ هوشمندی آن است یا برعکس؛ چون اینطور می‌نماید که انسان‌ها معمولاً کارها را بهینه انجام نمی‌دهند. بنا به تعریفی یک الگوریتم را هوشمندانه می‌گویند اگر:

* هیچ‌گاه و به‌ازای هیچ نمودی از مسئله خطا نداشته باشد.
* دارای پیچیدگی زمانی و همگرایی بسیار خوبی باشد.

همان‌طور که محسوس است، این تعریف نیز چندان از ذات کیفی بودن خود شاخص دور نشده‌است. شاید تعریف زیر بتواند قدری به کمٓی‌سازی این ویژگی کمک کند:

الگوریتم A از الگوریتم B هوشمندتر است اگر به‌طور همزمان:

* خطای الگوریتم A کمتر از خطای الگوریتم B باشد.
* پیچیدگی زانی و همگرایی الگوریتم A بدتر از الگوریتم B نباشد.

چند نکته درمورد مقولهٔ هوشمندی مطرح می‌شود:

* طبق تعریف داده شده می‌توان از ترایایی (تعدی) برای بررسی ۳ الگوریتم بهره جست.
* برای یافتن هوشمندی یک الگوریتم (که با توجه به پارامتر «خطا» عموماً برای الگوریتم‌های آماری بررسی می‌شود) می‌بایست به آزمون‌های پیچیده‌تری که منجر به سنجش هوشمندی آماری می‌شود رجوع کرد.

توابع رشد
---------

۱. برای تابعg(n) تابع {\displaystyle \Theta (g(n))} را به صورت مجموعه توابع زیر تعریف می‌کنیم:

{\displaystyle \Theta (g(n))=\{f(n):\exists c\_{1},c\_{2}>0\ and\ n\_{0},\ such\ that\ \forall n\geq n\_{0}0\leq c\_{1}g(n)\leq f(n)\leq c\_{2}g(n)\}}
و می‌گوییم تابع g(n) **کران بسته مجانبی** برای f(n) است و معمولاً به کار می‌بریم:
{\displaystyle f(n)=\Theta (g(n))}

۲. برای تابعg(n) تابع {\displaystyle {\mathcal {O}}(g(n))} را به صورت مجموعه توابع زیر تعریف می‌کنیم:

{\displaystyle {\mathcal {O}}(g(n))=\{f(n):\exists c>0\ and\ n\_{0},\ such\ that\ \forall n\geq n\_{0}0\leq f(n)\leq cg(n)\}}
ُیعنی آهنگ رشد تابع g(n) برای مقادیر بزرگ n، بیشتر یا مساوی آهنگ رشد تابع f(n) است. در این صورت می‌گوییم تابع g(n) **کران بالای مجانبی** برای f(n) است و معمولاً به کار می‌بریم:
{\displaystyle f(n)={\mathcal {O}}(g(n))}

۳. برای تابعg(n) تابع {\displaystyle \varOmega (g(n))} را به صورت مجموعه توابع زیر تعریف می‌کنیم:

{\displaystyle \varOmega (g(n))=\{f(n):\exists c>0\ and\ n\_{0},\ such\ that\ \forall n\geq n\_{0}0\leq cg(n)\leq f(n)\}}
ُیعنی آهنگ رشد تابع g(n) برای مقادیر بزرگ n، کندتر یا مساوی آهنگ رشد تابع f(n) است. در این صورت می‌گوییم تابع g(n) **کران پایین مجانبی** برای f(n) است و معمولاً به کار می‌بریم:
{\displaystyle f(n)=\varOmega (g(n))}

نکته: شرط لازم و کافی برای اینکه {\displaystyle f(n)=\Theta (g(n))} این است که {\displaystyle f(n)=\varOmega (g(n))} و {\displaystyle f(n)={\mathcal {O}}(g(n))}

قضیه اصلی واکاوی الگوریتم‌ها
----------------------------

یک نمونه از درخت بازگشتی که هزینهٔ هر مرحله رئوس این درخت‌اند.
در الگوریتم‌های بازگشتی که اندازهٔ ورودی n است؛ زمان اجرای الگوریتم از رابطه زیر پیروی می‌کند:

{\displaystyle T(n)=a\;T\!\left({\frac {n}{b}}\right)+f(n)}
که برخاسته از تحلیل درخت بازگشتی الگوریتم است.
متغیر:{\displaystyle c\_{\operatorname {crit} }} را به صورت {\displaystyle c\_{\operatorname {crit} }=\log \_{b}a} تعریف می‌کنیم؛ و پیچیدگی زمانی الگوریتم را به صورت زیر محاسبه می‌کنیم:

| Case | حالت بندی روی f(n) درمقایسه با {\displaystyle c\_{\operatorname {crit} }}, یعنی {\displaystyle \log \_{b}a} | توضیحات | توصیف با تابع رشد | مثال |
| --- | --- | --- | --- | --- |
| ۱ | اگر {\displaystyle f(n)={\mathcal {O(n^{c})}}} در شرایطی که {\displaystyle c<c\_{\operatorname {crit} }} | آهنگ رشد f(n) بر برگ‌ها غلبه می‌کند. | جواب به صورت زیر است :
{\displaystyle T(n)=\Theta \left(n^{c\_{\operatorname {crit} }}\right)} | اگر {\displaystyle b=a^{2}} و {\displaystyle f(n)={\mathcal {O(n^{1/2-\epsilon })}}}, آنگاه {\displaystyle T(n)=\Theta (n^{1/2})}. |
| ۲ | وقتی {\displaystyle f(n)=\Theta (n^{c\_{\operatorname {crit} }}\log ^{k}n)} برای هر {\displaystyle k\geq 0} | آهنگ رشد توابع بازگشتی با f(n) تقریباً یکسان است. | جواب به صورت زیر است : {\displaystyle T(n)=\Theta \left(n^{c\_{\operatorname {crit} }}\log ^{k+1}n\right)} | اگر {\displaystyle b=a^{2}} و {\displaystyle f(n)=\Theta (n^{1/2})}, آنگاه {\displaystyle T(n)=\Theta (n^{1/2}\log n)}.

اگر {\displaystyle b=a^{2}} و {\displaystyle f(n)=\Theta (n^{1/2}\log n)}, آنگاه {\displaystyle T(n)=\Theta (n^{1/2}\log ^{2}n)}. |
| ۳ | وقتی {\displaystyle f(n)=\Omega (n^{c})} در حالی که {\displaystyle c>c\_{\operatorname {crit} }} | آهنگ رشد توابع بازگشتی ایجاد شده زیاد بوده و تعداد برگ‌ها به f(n) غلبه می‌کند. | جواب به صورت زیر است:

{\displaystyle T\left(n\right)=\Theta \left(f(n)\right)} | اگر {\displaystyle b=a^{2}} و {\displaystyle f(n)=\Omega (n^{1/2+\epsilon })} آنگاه {\displaystyle T(n)=\Theta (f(n))}. |

تحلیل سرشکنی
------------

گاهی با دنباله‌ای از اعمال روی داده‌ساختاری سروکار داریم که هزینه‌شان بالا ولی تعدادشان پایین است و یا برعکس؛ یا اینکه یک عمل که هزینه زیادی دارد موجب می‌شود تا همان عمل در مراحل بعد با هزینهٔ کمتری انجام شود. در این حالت هزینهٔ یک عمل در بدترین حالتش زیاد است، اما اگر میانگین مجموع هزینه‌ها را برای همهٔ اعمال موجود در دنباله حساب کنیم؛ هزینهٔ معقول‌تری نسبت به هزینه در بدترین حالت را به دست آورده‌ایم؛ که به آن هزینهٔ سرشکنی و به روش محاسبه آن تحلیل سرشکنی می‌گویند.

### روش‌های تحلیل سرشکنی

#### روش انبوهه

در این روش مطابق تعریف، جمع هزینه‌های اعمال محسابه می‌شود و بر تعداد آن‌ها تقسیم می‌شود تا هزینهٔ سرشکن شده به‌دست آید.

#### روش حساب‌داری

این روش یک مدل‌سازی با سازوکار خزانه‌ای است. در این روش به ازای هر عمل، مقداری پرداختی وجود دارد. فرض کنید که مبلغی صرف انجام خود عمل می‌شود و مازاد آن در مخزن ذخیره می‌شود. در هر عملیات اگر هزینه بیشتر از پرداختی آن نوبت بود از خزانه برای جبران آن استفاده می‌شود. درصورتی که خزانه هیچ‌گاه کمبود نداشته باشد، میزان پول پرداختی برای هر عمل با هزینهٔ سرشکن شدهٔ آن عمل متناسب است.

#### روش تابع پتانسیل

این روش تعمیم‌یافتهٔ همان روش حساب‌داری است که با فرمول‌بندی ریاضی بیان و تحلیل می‌شود.

#### توضیح تابع پتانسیل

فرض کنید {\displaystyle D\_{0}} داده‌ساختار اولیه و {\displaystyle D\_{i}} داده‌ساختار ما بعد از عمل iام باشد. همچنین فرض کنید که {\displaystyle c\_{i}} هزینهٔ واقعی عمل iام است. در این صورت تابع پتانسیل {\displaystyle \Phi (D\_{i})} را تعریف می‌کنیم که {\displaystyle D\_{i}} را به یک عدد حقیقی نگاشت می‌کند. همچنین {\displaystyle {\hat {c}}} را مطابق فرمول زیر تعریف می‌کنیم:

{\displaystyle {\hat {c\_{i}}}=c\_{i}+\Phi (D\_{i})-\Phi (D\_{i-1})}

و آن را هزینهٔ سرشکن شدهٔ عمل iام می‌نامیم.

در این صورت داریم: {\displaystyle \sum \_{i=1}^{n}{\hat {c\_{i}}}=\sum \_{i=1}^{n}c\_{i}+\Phi (D\_{n})-\Phi (D\_{0})}

اگر {\displaystyle \Phi (D\_{0})=0}، داریم: {\displaystyle \sum \_{i=1}^{n}{\hat {c\_{i}}}\geq \sum \_{i=1}^{n}{c\_{i}}}

یعنی {\displaystyle \sum \_{i=1}^{n}{\hat {c\_{i}}}} کران بالایی برای {\displaystyle \sum \_{i=1}^{n}{c\_{i}}} است که می‌خواهیم بدست آوریم.

با نیم‌نگاهی به روش حساب‌داری می‌توان چنین تناظری میان آن و روش تابع پتانسیل برقرار کرد:

* {\displaystyle \Phi (D\_{i})}: مقدار پول موجود در مخزن
* {\displaystyle {\hat {c\_{i}}}}: مقدار پول پرداختی برای عمل iام
* {\displaystyle c\_{i}}: مقدار هزینهٔ صرف‌شده برای عمل iام
* اگر {\displaystyle c\_{i}<{\hat {c\_{i}}}} مابه‌التفاوت به مخزن اضافه می‌شود یعنی: {\displaystyle \Phi (D\_{i})=\Phi (D\_{i-1})+{\hat {c\_{i}}}-c\_{i}}
* اگر {\displaystyle c\_{i}>{\hat {c\_{i}}}} برای انجام عمل iام لازم است به اندازهٔ {\displaystyle c\_{i}-{\hat {c\_{i}}}} از مخزن برداریم تا بتوانیم این عمل را انجام دهیم.
* پس موجودی در مخزن خواهد بود: {\displaystyle \Phi (D\_{i})=\Phi (D\_{i-1})-({\hat {c\_{i}}}-c\_{i})}
* برای استفاده از این روش باید تابع پتانسیلی تعریف کنیم که دارای شرایط گفته شده باشد.

### مسئلهٔ شمارنده

#### تحلیل شمارنده با روش انبوهه

یک شمارندهٔ k بیتی درنظر بگیرید که در ابتدا صفر است. با هر مرحله افزایش حداکثر یک بیت آن از ۰ به ۱ تغییر می‌کند و تعدادی از بیت‌ها نیز از ۱ به ۰ تغییر خواهند داشت. هزینهٔ دقیق این عملیات، متناسب با تعداد تغییر بیت‌ها در شمارنده خواهد بود. فرض کنید بیت‌ها به ترتیب ارزش از {\displaystyle k-1} تا {\displaystyle 0} شماره گذاری شده باشند. در این‌صورت خواهیم داشت:

بیت ۰: با هر افزایش تغییر می‌کند یعنی در مجموع n بار.

بیت ۱: یک در میان تغییر می‌کند یعنی در مجموع {\displaystyle \lfloor {\frac {n}{2}}\rfloor } بار.

بیت i: در مجوع دقیقاً {\displaystyle \lfloor {\frac {n}{i}}\rfloor } بار تغییر می‌کند.

تعداد تغییرات بیت‌ها: {\displaystyle \sum \_{i=0}^{k-1}\lfloor {\frac {n}{2^{i}}}\rfloor <n\sum \_{i=0}^{\infty }{\frac {1}{2^{i}}}=2n}

پس هزینهٔ سرشکن شدهٔ هر عمل افزایش، {\displaystyle {\mathcal {O(1)}}} است.

### مسئلهٔ پشته

#### تحلیل پشته با روش تابع پتانسیل

در این روش {\displaystyle \Phi (D\_{i})} را برابر تعداد عناصر موجود در پشته می‌گیریم. بدیهتاً در ابتدا این مقدار صفر بوده تا پایان مجموع عملیات‌ها مقداری مثبت خواهد داشت.

اکنون هزینهٔ سرشکن شده را بدست می‌آوریم:

**Push:** چون یک عنصر اضافه می‌شود داریم:

{\displaystyle \Phi (D\_{i})-\Phi (D\_{i-1})=1}

از طرفی چون می‌دانیم که هزینهٔ درج واقعی {\displaystyle c\_{i}-1} است پس:

{\displaystyle {\hat {c\_{i}}}={c\_{i}}+\Phi (D\_{i})-\Phi (D\_{i-1})=1+1=2}

**Pop:** چون یک عنصر کم می‌شود داریم:

{\displaystyle \Phi (D\_{i})-\Phi (D\_{i-1})=-1}

هزینهٔ واقعی حذف هم {\displaystyle c\_{i}=1} است پس {\displaystyle {\hat {c\_{i}}}=1-1=0}

**Multi-Pop:** چون تعدادی عمل **Pop** است پس هزینهٔ آن نیز صفر می‌باشد.

بنابراین چون

{\displaystyle \sum \_{i=1}^{n}{c\_{i}}\leq \sum \_{i=1}^{n}{\hat {c\_{i}}}=2n}

هزینهٔ سرشکن شده {\displaystyle {\mathcal {O(1)}}} است.

روش‌های ابتکاری
---------------

آنچه که در بالا مطرح شد، شاخص‌هایی بود برای تحلیل عادی الگوریتم‌ها به کار می‌رفت؛ لیکن الگوریتم‌هایی هستند دوگانه (هیبریدی) که حل آن‌ها ابتکاری یا فرا ابتکاری محسوب می‌شود و رسیدن به آن‌ها از چارچوب یک تحلیل ریاضیاتی ساده و به‌کار بردن الگوریتم‌های آشنا خارج است که می‌توان به نمونه‌هایی از آن‌ها اشاره کرد:

* الگوریتم تبرید شبیه‌سازی شده
* الگوریتم ژنتیک
* الگوریتم کلونی مورچگان
* الگوریتم جستجوی ممنوعه

منابع
-----

* قدسی، محمد (۱۳۹۵). *داده‌ساختارها و مبانی الگوریتم‌ها*. تهران: انتشارات فاطمی.
* Leiserson، Chales (۲۰۰۹). *Introduction to Algortihms*.
* عشقی، کورش (۱۳۹۵). *تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری*. تهران: مؤسسهٔ انتشارات علمی دانشگاه صنعتی شریف.
* ویکی‌پدیای انگلیسی

پانویس
------

1. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۶۵
2. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۷۹
3. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۰۰
4. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۶۹
5. ↑  *Introduction to Algortihms, 2.2*.
6. ↑  "GeeksForGeeks" (به انگلیسی).
7. ↑  *Introduction to Algortihms, 26-27*.
8. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۱۶۵−۱۶۶
9. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۱۶۷−۱۷۲
10. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۱۷۵−۱۷۶
11. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۶۹-۷۱
12. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۷۱-۷۲
13. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۷۲-۷۳
14. ↑  Introduction to Algorithm, 94-96
15. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۱۶
16. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۱۸
17. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۲۰−۱۲۱
18. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۱۹
19. ↑  قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۲۱−۱۲۳
20. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۲۲۳
21. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۲۵۷
22. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۳۱۹
23. ↑  عشقی، تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری، ۳۸۱

| * ن
* ب
* و
علوم رایانه |
| --- |
| Note: This template roughly follows the 2012 ACM Computing Classification System. |
| سخت‌افزار | 
* برد مدار چاپی
* دستگاه جانبی
* مدار مجتمع
* یکپارچه‌سازی کلان‌مقیاس
* سامانه روی یک تراشه
* رایانش سبز
* خودکارسازی طراحی الکترونیکی
* شتاب‌دهنده سخت‌افزاری

 |
| سازمانسامانه‌های رایانه | 
* معماری رایانه
* سامانه نهفته
* رایانش بی‌درنگ
* اطمینان‌پذیری

 |
| شبکه رایانه‌ای | 
* معماری شبکه
* پروتکل ارتباطات
* سخت‌افزار شبکه
* برنامه‌ریز شبکه
* کارایی شبکه رایانه‌ای
* سرویس شبکه‌ای

 |
| سازمان نرم‌افزار | 
* مفسر
* میان‌افزار
* ماشین مجازی
* سیستم‌عامل
* کیفیت نرم‌افزار

 |
| نظریه زبان‌های برنامه‌نویسیو ابزار توسعه نرم‌افزار | 
* الگو برنامه‌نویسی
* زبان برنامه‌نویسی
* کامپایلر
* زبان خاص دامنه
* زبان مدل‌سازی
* چارچوب نرم‌افزاری
* محیط یکپارچه توسعه نرم‌افزار
* مدیریت پیکربندی نرم‌افزار
* کتابخانه (رایانه)
* مخزن نرم‌افزاری

 |
| توسعه نرم‌افزار | 
* فرایند توسعه نرم‌افزار
* تحلیل نیازمندی‌ها
* طراحی نرم‌افزار
* ساخت نرم‌افزار
* استقرار نرم‌افزار
* تعمیر و نگهداری نرم‌افزار
* تیم برنامه‌نویسی
* نرم‌افزار متن‌باز
* برنامه‌نویسی
* آزمون نرم‌افزار

 |
| نظریه محاسبات | 
* مدل محاسبه
* زبان صوری
* نظریه اتوماتا
* نظریه رایانش‌پذیری
* نظریه پیچیدگی محاسباتی
* منطق در علوم کامپیوتر
* معنی‌شناسی (علوم رایانه)

 |
| الگوریتمها | 
* الگوریتم
* تحلیل الگوریتم‌ها
* کارایی الگوریتمی
* الگوریتم‌های تصادفی
* هندسه محاسباتی

 |
| ریاضیاترایانه | 
* ریاضیات گسسته
* احتمالات
* آمار
* نرم‌افزار ریاضی
* نظریه اطلاعات
* آنالیز ریاضی
* آنالیز عددی

 |
| سامانه اطلاعاتی | 
* پایگاه داده
* ذخیره‌سازی داده رایانه
* سامانه اطلاعات سازمانی
* نرم‌افزار اجتماعی
* سامانه اطلاعات جغرافیایی
* سامانه پشتیبانی تصمیم
* کنترل فرایند
* پایگاه داده چند رسانه‌ای
* داده‌کاوی
* کتابخانه دیجیتال
* سکوی رایانش
* بازاریابی اینترنتی
* وب جهان‌گستر
* بازیابی اطلاعات
* مستندسازی فنی

 |
| امنیت رایانه | 
* رمزنگاری
* روش‌های صوری
* خدمات امنیتی
* سامانه تشخیص نفوذ
* خرابی سخت‌افزار
* امنیت شبکه
* امنیت اطلاعات
* امنیت برنامه

 |
| تعامل انسان و رایانه | 
* طراحی تعاملی
* رایانش اجتماعی
* رایانش فراگیر
* مصورسازی
* دسترس‌پذیری رایانه
* واسط‌های کاربر
* رایانش پوشیدنی

 |
| همروندی | 
* رایانش همزمان
* رایانش موازی
* رایانش توزیع‌شده
* چندریسمانی
* چندپردازشی

 |
| هوش مصنوعی | 
* پردازش زبان‌های طبیعی
* بازنمود دانش
* بینایی رایانه‌ای
* برنامه‌ریزی خودکار
* بهینه‌سازی
* نظریه کنترل
* فلسفه هوش مصنوعی
* هوش مصنوعی توزیع شده
* استدلال خودکار
* زبان‌شناسی رایانشی
* یادگیری ماشینی

 |
| یادگیری ماشین | 
* یادگیری با نظارت
* یادگیری بی‌نظارت
* یادگیری تقویتی
* یادگیری چند-وظیفه‌ای
* روش اعتبارسنجی متقابل

 |
| گرافیک رایانه‌ای | 
* پویانمایی رایانه‌ای
* رندرینگ (گرافیک رایانه‌ای)
* روتوش
* واحد پردازش گرافیکی
* واقعیت ترکیبی
* واقعیت مجازی
* فشرده‌سازی تصویر
* مدلسازی جامد

 |
| رایانشکاربردی | 
* تجارت الکترونیک
* نرم‌افزار سازمانی
* ریاضیات محاسباتی
* فیزیک محاسباتی
* شیمی محاسباتی
* زیست‌شناسی محاسباتی
* علوم اجتماعی محاسباتی
* مهندسی و علم محاسبه
* انفورماتیک پزشکی
* هنر دیجیتال
* نشر الکترونیک
* جنگ مجازی
* رأی‌گیری الکترونیکی
* بازی ویدئویی
* واژه‌پرداز
* تحقیق در عملیات
* فناوری آموزشی
* سامانه مدیریت اسناد

 |
| توجه: بنا بر سامانه رده‌بندی رایانش ای‌سی‌ام علم رایانه همچنین می‌تواند به موضوع‌ها یا زمینه‌های گوناگون تقسیم شود.
* **کتاب:علوم رایانه**
* **رده:علوم رایانه**
* **طرح کلی علوم رایانه**
* **ویکی‌پدیا:ویکی‌پروژه علوم رایانه**
* **ویکی‌انبار**
 |

| * ن
* ب
* و
ریاضیات صنعتی و کاربردی |
| --- |
| ریاضیات محاسباتی | 
* الگوریتمs
	+ الگوریتم
	+ تحلیل الگوریتم‌ها
* نظریه اتوماتا
* نظریه کدگذاری
* منطق در علوم کامپیوتر
* رمزنگاری
* نظریه اطلاعات

 |
| ریاضیات گسسته | 
* جبر رایانه‌ای
* نظریه اعداد رایانشی
* ترکیبیات
* نظریه گراف
* هندسه گسسته

 |
| آنالیز ریاضی | 
* نظریه تقریب
* Clifford analysis
	+ Clifford algebra
* معادله دیفرانسیل
	+ Complex differential equations
	+ معادله دیفرانسیل معمولی
	+ معادله دیفرانسیل با مشتقات جزئی
	+ معادله دیفرانسیل تصادفی
* هندسه دیفرانسیل
	+ Differential forms
	+ Gauge theory
	+ Geometric analysis
* سامانه پویا
	+ نظریه آشوب
	+ نظریه کنترل
* آنالیز تابعی
	+ Operator algebra
	+ نظریه عمل‌گرها
* آنالیز هارمونیک
	+ آنالیز فوریه
* Multilinear algebra
	+ Exterior
	+ Geometric
	+ تانسور
	+ حساب برداری
* حساب چندمتغیره
	+ Exterior
	+ Geometric
	+ حساب تانسوری
	+ حساب برداری
* آنالیز عددی
	+ جبر خطی عددی
	+ حل عددی معادلات دیفرانسیل معمولی
	+ Numerical methods for partial differential equations
	+ Validated numerics
* حساب تغییرات

 |
| نظریه احتمالات | 
* توزیع احتمالs (متغیر تصادفیs)
* فرایند تصادفیes / حسابان تصادفی
* Path integral
* Stochastic variational calculus

 |
| ریاضی فیزیک | 
* مکانیک تحلیلی
	+ مکانیک لاگرانژی
	+ مکانیک همیلتونی
* میدان (فیزیک)
	+ نظریه میدان کلاسیک
	+ Conformal
	+ Effective
	+ نظریه پیمانه‌ای
	+ نظریه میدان‌های کوانتومی
	+ Statistical
* نظریه پتانسیل
* نظریه ریسمان
	+ Topological

|  |  |
| --- | --- |
| ساختارهای جبری | 
* Algebra of physical space
* فرمول‌بندی انتگرال مسیر
* Quantum group
* گروه بازبهنجارش
* Representation theory
* Spacetime algebra

 |

 |
| نظریه‌های تصمیم | 
* نظریه بازی
* تحقیق در عملیات
* بهینه‌سازی
* نظریه انتخاب اجتماعی
* آمار
* اقتصاد ریاضی
* ریاضیات مالی

 |
| کاربردهای دیگر | 
* زیست‌شناسی ریاضیاتی و نظری
* شیمی ریاضیاتی
* روانشناسی ریاضی
* Sociology
* "The Unreasonable Effectiveness of Mathematics in the Natural Sciences"

 |
| مرتبط | 
* ریاضیات

 |
| سازمان‌ها | 
* Society for Industrial and Applied Mathematics
	+ Japan Society for Industrial and Applied Mathematics
* Société de Mathématiques Appliquées et Industrielles
* International Council for Industrial and Applied Mathematics

 |
| 
* 
* درگاه:ریاضیات / outline / فهرست مفاهیم ریاضی

 |