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

مقدمه
-----

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

بعد از این نظریه که بیان می‌کند کدام مسائل قابل حل و کدام مسائل غیرقابل حل هستند، این سؤال به نظر طبیعی می‌رسد که درجه سختی مسئله چقدر است. نظریه پیچیدگی محاسبات در این زمینه‌است.

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

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

معروف‌ترین کلاس‌های پیچیدگی، **P** و **NP** هستند که مسئله‌ها را از نظر زمان مورد نیاز تقسیم‌بندی می‌کنند. به‌طور شهودی می‌توان گفت **P** کلاس مسئله‌هایی است که الگوریتم‌های سریع برای پیدا کردن جواب آن‌ها وجود دارد. اما **NP** شامل آن دسته از مسئله‌هاست که اگرچه ممکن است پیدا کردن جواب برای آن‌ها نیاز به زمان زیادی داشته باشد اما چک کردن درستی جواب به وسیلهٔ یک الگوریتم سریع ممکن است.
البته کلاس‌های پیچیدگی به مراتب سخت‌تری از **NP** نیز وجود دارند.

* **P-SPACE**: مسائلی که با اختصاص دادن مقدار کافی حافظه (که این مقدار حافظه معمولاً تابعی از اندازه مسئله می‌باشد) بدون در نظر گرفتن زمان مورد نیاز به حل آن، می‌توانند حل شوند.
* **EXP-TIME**: مسائلی که زمان مورد نیاز برای حل آن‌ها به صورت توانی می‌باشد. مسائل این کلاس شامل همه مسائل سه کلاس بالایی نیز می‌باشد. نکته جالب و قابل توجه این است که حتی این کلاس نیز جامع نمی‌باشد؛ یعنی مسائلی وجود دارند که بهترین و کارامدترین الگوریتم‌ها نیز زمان بیش‌تری نسبت به زمان توانی می‌گیرند.
* **Un-decidable** یا **غیرقابل تصمیم‌گیری**: برای برخی از مسائل می‌توانیم اثبات کنیم که الگوریتمی را نمی‌شود پیدا کرد که همیشه آن مسئله را حل می‌کند، بدون در نظر گرفتن فضا و زمان. به عقیده ریچارد لیپتون (از صاحب‌نظران این زمینه): یک روش اثبات غیررسمی برای این مسئله می‌تواند این باشد: تعداد زیادی مسئله، مثلاً به زیادی اعداد حقیقی وجود دارند، ولی تعداد برنامه‌هایی که مسائل را حل می‌کنند در حد اعداد صحیح هستند. اما ما همیشه می‌توانیم مسائل کاربردی و مهمی را پیدا کنیم که قابل حل نیستند.

P و NP
------

### آیا P=NP است؟

دقیقاً برابر بودن مسائل کلاس P با مسائل کلاس NP، یکی از مهم‌ترین سؤال‌های بدون جواب علوم کامپیوتری است. به بیانی دیگر اگر همیشه به این سادگی بتوان صحت یک راه‌حل را بررسی کرد، آیا پیدا کردن راه‌حل نیز می‌تواند به آن سادگی باشد؟ برای این سؤال یک جایزه ۱ میلیون دلاری از طرف انسیتیتو ریاضی Clay در نظرگرفته شده‌است. ما هیچ دلیلی برای قبول کردن آن نداریم ولی بین نظریه‌پردازان نیز این باور وجود دارد که باید جواب این سؤال منفی باشد{{}}. همچنین دلیلی برای رد کردن آن نیز وجود ندارد.

یپچیدگی زمان
------------

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

پیچیدگی رایانشی:

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

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

دوم، مسئله مرتب‌سازی یکی از معدود مسائلی است که در بسط الگوریتم‌هایی با پیچیدگی زمانی نزدیک به حد پایینی از آن موفق بوده‌است.

معرفی Np کامل
-------------

تا این بخش از مقاله مسائلی معرفی شدند که اگر بتوان روشی برای حل آن‌ها حدس زد، در زمان نزدیک به زمان خطی یا حداقل در زمان چند جمله‌ای برحسب ورودی می‌توانستیم صحت راه‌حل را بررسی کنیم؛ ولی **NP-Complete**ها مسائلی هستند که اثبات شده به سرعت قابل حل نیستند.
در تئوری پیچیدگی NP-Completeها دشوارترین مسائل کلاس NP هستند و جزء مسائلی می‌باشند که احتمال حضورشان در کلاس P خیلی کم است. علت این امر این می‌باشد که اگر یک راه‌حل پیدا شود که بتواند یک مسئله NP-Complete را حل کند، می‌توان از آن الگوریتم برای حل کردن سریع همه مسائل NP-Complete استفاده کرد. به خاطر این مسئله و نیز بخاطر اینکه تحقیقات زیادی برای پیدا کردن الگوریتم کارآمدی برای حل کردن اینگونه مسائل با شکست مواجه شده‌اند، وقتی که مسئله‌ای به عنوان NP-Complete معرفی شد، معمولاً اینطور قلمداد می‌شود که این مسئله در زمان Polynomial قابل حل شدن نمی‌باشد، یا به بیانی دیگر هیچ الگوریتمی وجود ندارد که این مسئله را در زمان Polynomial حل نماید.
کلاس متشکل از مسائل **NP-Complete** با نام **NP-C** نیز خوانده می‌شود.

بررسی ناکارآمد بودن زمانی
-------------------------

مسائلی که در تئوری قابل حل شدن می‌باشند ولی در عمل نمی‌توان آن‌ها را حل کرد، محال یا ناشدنی می‌نامند. در حالت کلی فقط مسائلی که زمان آن‌ها به صورت Polynomial می‌باشد و اندازه ورودی آن‌ها در حد کوچک یا متوسط می‌باشد قابل حل شدن می‌باشند. مسائلی که زمان آن‌ها به صورت توانی (EXPTIME-complete) می‌باشند به عنوان مسائل محال یا ناشدنی شناخته شده‌اند. همچنین اگر مسائل رده NP جز مسائل رده P نباشند، مسائل NP-Complete نیز به عنوان محال یا نشدنی خواهند بود.
برای ملموس‌تر شدن این مسئله فرض کنید که یک مسئله 2^n مرحله لازم دارد تا حل شود (n اندازه ورودی می‌باشد). برای مقادیر کوچک n=۱۰۰ و با در نظر گرفتن کامپیوتری که {\displaystyle 10^{10}} (10 giga) عملیات را در یک ثانیه انجام می‌دهد، حل کردن این مسئله زمانی حدود {\displaystyle 10^{12}\*4} سال طول خواهد کشید، که این زمان از عمر فعلی جهان بیشتر است!

روش‌هایی برای حل مسائل NP-Complete
----------------------------------

به دلیل این که تعداد مسائل NP-Complete بسیار زیاد می‌باشد، شناختن این گونه مسائل به ما کمک می‌کند تا دست از پیدا کردن یک الگوریتم سریع و جامع برداریم و یکی از روش‌های زیر را امتحان کنیم:

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

نمونه مسئله
-----------

یک مسیر ساده در یک گراف به مسیری اطلاق می‌شود که هیچ راس یا یال تکراری در آن وجود نداشته‌ باشد. برای پیاده‌سازی مسئله ما به این احتیاج داریم که بتوانیم یک سؤال بلی/خیر طراحی کنیم. با داشتن گراف G، رئوس s و t و عدد k آیا یک مسیر ساده از s به t با حداقل k یال وجوددارد؟ راه‌حل این مسئله جواب سؤال خواهد بود.
چرا این مسئله NP می‌باشد؟ چون اگر مسیری به شما داده شود، به راحتی می‌توان طول مسیر را مشخص نمود و آن را با k مقایسه کرد. همه این کارها در زمان خطی و صد البته در زمان Polynomial قابل انجام می‌باشد.
اگر چه می‌دانیم که این مسئله آیا در کلاس P می‌باشد یا نه، با این حال روش خاصی برای پیدا کردن مسیری با ویژگی‌های ذکر شده نیز بیان نشده‌است؛ و در حقیقت این مسئله جز NP-Completeها می‌باشد، پس می‌توان به این نتیجه نیز رسید که الگوریتمی کارآمد با چنان عملیات وجود ندارد.
الگوریتم‌هایی وجود دارند که این مسئله را حل می‌کنند، به عنوان مثال همه مسیرهای موجود و ممکن را بررسی نموده و نتایج مقایسه شوند که آیا این مسیر مسئله را حل می‌کند یا نه. اما تا آنجایی که می‌دانیم، الگوریتمی با زمان Polynomial برای حل این مسئله وجود ندارد.

جستارهای وابسته
---------------

* پیچیدگی زمانی
* زمان اجرای الگوریتم
* طراحی الگوریتم
* مهندسی الگوریتم
* کلاس پیچیدگی
* P (پیچیدگی)
* NP (پیچیدگی)
* الگوریتم ان‌پی-آسان
* ان‌پی سخت
* ان‌پی کامل
* ان-پی کامل قوی
* مسئله P در مقابل NP
* نظریه پیچیدگی کوانتومی

منابع
-----

1. ↑  «سامانه واژه‌یار». *vajeyar.apll.ir*. دریافت‌شده در ۲۰۲۳-۰۸-۰۳.
2. ↑  بهینه‌سازی ترکیبی و الگوریتم‌های فرا ابتکاری، دکتر کوروش عشقی

* M.R. Garey and D.S. Johnson (۱۹۸۳)، *Computers and Intractability: A Guide to the Theory of P-Completeness*، New York: W. H. Freeman، شابک ۰-۷۱۶۷-۱۰۴۵-۵
* Wikipedia contributors, "Computational complexity theory," Wikipedia, The Free Encyclopedia,  (accessed February 4, 2008).

|  |  |
| --- | --- |
|  | در ویکی‌انبار پرونده‌هایی دربارهٔ نظریه پیچیدگی محاسباتی موجود است. |

|  |  |
| --- | --- |
| داده‌های کتابخانه‌ای: کتابخانه‌های ملی ویرایش در ویکی‌داده | 
* آلمان
* اسرائیل
* ایالات متحده آمریکا
* جمهوری چک

 |

| * ن
* ب
* و
الگوریتم‌های مرتب‌سازی |
| --- |
| تئوری | 
* نظریه پیچیدگی محاسباتی
* نمادهای O و Ω و Θ
* ترتیب کامل
* الگوریتم مرتب‌سازی
* شبکه مرتب‌سازی
* مرتب‌سازی مقایسه‌ای

 |  |
| گونه‌های تعویضی | 
* حبابی
* دست‌نشانده
* زوج و فرد
* ساختگی
* سریع
* شانه‌ای
* کوکتلی
* گورزاد

 |
| گونه‌های انتخابی | 
* انتخابی
* دایره‌ای
* درخت دکارتی
* روان
* مسابقه‌ای
* هرمی

 |
| گونه‌های درجی | 
* درجی
* درختی
* شکیبانه
* صدفی
* کتابخانه‌ای
* گسترده

 |
| گونه‌های ادغامی | 
* ادغامی آبشاری
* ادغامی چندمرحله‌ای
* ادغامی نوسانی
* ادغامی
* رشته‌ای

 |
| گونه‌های توزیعی | 
* انفجاری
* پایه‌ای
* پرچم آمریکا
* مجاور-نگاشت (پروکس‌مپ)
* سطلی
* شمارشی
* فلش
* لانه‌کبوتری
* مهره‌ای

 |
| گونه‌های همرو | 
* ادغامی دسته‌ای فرد-زوج
* بایتونیک
* جفتی

 |
| گونه‌های دوگانه | 
* آن‌شافل
* تیم
* جی‌سورت
* درونگرا
* گسترش‌یافته

 |
| گونه‌های دیگر | 
* اسپاگتی
* توپولوژیکی
* کلوچه‌ای

 |

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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