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

محتوای حذف‌شده محتوای افزوده‌شده
YashRZB (بحث | مشارکت‌ها)
اصلاح نویسه، اصلاح ارقام، اصلاح سجاوندی، اصلاح املا، ابرابزار
YashRZB (بحث | مشارکت‌ها)
افزودن پیوند به ویکی یا بیرون
خط ۲۵:
 
=== تحلیل زمان اجرای الگوریتم ===
همان‌طور که در بالا گفته شد، تحلیل الگوریتم به معنای تخمین میزان منابعی است که الگوریتم به آن نیاز دارد. فرض می‌کنیم با یک تک پردازندهٔ عمومی پیاده‌سازی شده با [[حافظه دسترسی تصادفی|حافظه دسترسی تصادفی (RAM)]] طرف هستیم و الگوریتم پیاده‌سازی شدهٔ ما توسط برنامهٔ کامپیوتری، عملیات‌ها را هم‌زمان انجام نمی‌دهد. در مدل RAM دستورات تعریف شده‌ای وجود دارند که اجرا کردن‌شان از یک مقدار ثابتی تبعیت می‌کند، دستوراتی که در ساختار کامیپوتر تعبیه شده‌اند: مانند عملگرهای حسابی (جمع و تقسیم و ضرب و غیره)، علمیات‌های انتقال اطلاعات (ذخیره کردن، رونویسی کردن حافظه، بازخوانی حافظه و غیره) و عملیات‌های کنترل (فراخوانی توابع، بازگشتن‌از دستور و غیره).<ref>2.2 ,CLRS, Analyzing Algorithm</ref>
 
شبه کد زیر که الگوریتم [[مرتب‌سازی حبابی]] زیررا بهپیاده‌سازی زبان پایتون رامی‌کند در نظر بگیریدنظربگیرید<ref>{{یادکرد وب|نویسنده=|کد زبان=en|تاریخ=|وبگاه=|نشانی=https://www.geeksforgeeks.org/python-program-for-bubble-sort/|عنوان=GeeksForGeeks}}</ref>:<syntaxhighlight lang="py3" line="1" start="1">
for i=1 to A.length
def bubbleSort(arr):
nfor j=1 len(arr)to A.length - i
for i in range(n): if A[j]>A[j+1]
for j in range(0, n-i-swap A[j],A[j+1):]
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
</syntaxhighlight>زمان اجرای الگوریتم، جمع زمان اجرای هر دستوری است که اجرا می‌شود. اگر زمان اجرای هر خط را (که گفتیم مقداری ثابت است) با <math>c_1,c_2,c_3,c_4</math> نشان دهیم و اگر <math>T_1 , T_2 , T_3 , T_4 \,</math> را زمان کل دستورات خط ۱ تا ۴ در نظر بگیریم، زمان اجرای کل برنامه برابر جمع زمان کل اجرای دستورات هر خط می‌شود.
 
سطر ۱۸۵ ⟵ ۱۸۳:
 
== [[تحلیل سرشکنی]] ==
گاهی با [[دنباله|دنباله‌ای]] از اعمال روی [[داده‌ساختار|داده‌ساختاری]] سروکار داریم که هزینه‌شان بالا ولی تعدادشان پایین است و یا برعکس؛ یا اینکه یک عمل که هزینه زیادی دارد موجب می‌شود تا همان عمل در مراحل بعد با هزینهٔ کمتری انجام شود. در این حالت هزینهٔ یک عمل در بدترین حالتش زیاد است، اما اگر میانگین مجموع هزینه‌ها را برای همهٔ اعمال موجود در دنباله حساب کنیم؛ هزینهٔ معقول‌تری نسبت به هزینه در بدترین حالت را به دست آورده‌ایم؛ که به آن هزینهٔ سرشکنی و به روش محاسبه آن تحلیل سرشکنی می‌گویند.<ref>قدسی، داده‌ساختارها و الگوریتم‌ها، {{عدد به فارسی|116}}</ref>
 
=== روش‌های تحلیل سرشکنی ===
سطر ۱۹۴ ⟵ ۱۹۲:
این روش یک مدل‌سازی با سازوکار خزانه‌ای است. در این روش به ازای هر عمل، مقداری پرداختی وجود دارد. فرض کنید که مبلغی صرف انجام خود عمل می‌شود و مازاد آن در مخزن ذخیره می‌شود. در هر عملیات اگر هزینه بیشتر از پرداختی آن نوبت بود از خزانه برای جبران آن استفاده می‌شود. درصورتی که خزانه هیچ‌گاه کمبود نداشته باشد، میزان پول پرداختی برای هر عمل با هزینهٔ سرشکن شدهٔ آن عمل متناسب است.
 
==== روش [[تابع پتانسیل ]]====
این روش تعمیم‌یافتهٔ همان روش حساب‌داری است که با فرمول‌بندی ریاضی بیان و تحلیل می‌شود.<ref>قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۱۸</ref>
 
سطر ۲۲۱ ⟵ ۲۱۹:
*برای استفاده از این روش باید تابع پتانسیلی تعریف کنیم که دارای شرایط گفته شده باشد.<ref>قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۲۰−۱۲۱</ref>
 
=== مسئلهٔ [[شمارنده ]]===
==== تحلیل شمارنده با روش انبوهه ====
یک شمارندهٔ <math>k</math> بیتی درنظر بگیرید که در ابتدا صفر است. با هر مرحله افزایش حداکثر یک بیت آن از ۰ به ۱ تغییر می‌کند و تعدادی از بیت‌ها نیز از ۱ به ۰ تغییر خواهند داشت. هزینهٔ دقیق این عملیات، متناسب با تعداد تغییر بیت‌ها در شمارنده خواهد بود. فرض کنید بیت‌ها به ترتیب ارزش از <math>k-1</math> تا <math>0</math> شماره گذاری شده باشند. در این‌صورت خواهیم داشت:
سطر ۲۳۷ ⟵ ۲۳۵:
پس هزینهٔ سرشکن شدهٔ هر عمل افزایش، <math>\mathcal {O(1)}</math> است.<ref>قدسی، داده‌ساختارها و الگوریتم‌ها، ۱۱۹</ref>
 
=== مسئلهٔ [[پشته ]]===
==== تحلیل پشته با روش تابع پتانسیل ====
در این روش <math>\Phi(D_i)</math> را برابر تعداد عناصر موجود در پشته می‌گیریم. بدیهتاً در ابتدا این مقدار صفر بوده تا پایان مجموع عملیات‌ها مقداری مثبت خواهد داشت.
سطر ۲۷۷ ⟵ ۲۷۵:
* {{یادکرد کتاب|نام خانوادگی = عشقی|نام = کورش|عنوان = تحلیل الگوریتم‌ها و طراحی روش‌های فرا ابتکاری|ناشر = مؤسسهٔ انتشارات علمی دانشگاه صنعتی شریف|شهر = تهران|سال = ۱۳۹۵}}
* و[[:en:Analysis_of_algorithms|یکی‌پدیای انگلیسی]]
*[https://www.geeksforgeeks.org GeeksForGeeks]
 
== پانویس ==