1 / 52

ساختمان داده ها و الگوریتم

جلسه اول و دوم. به نام خداوند هستی بخش یگانه. ساختمان داده ها و الگوریتم. Data Structures and Algorithms. A.M. Safaei. جلسه اول. الگوریتم. الگوریتم مجموعه ای از دستورالعمل ها برای حل یک مسئله می باشد که دارای شرایط زیر می باشد: 1- ورودی : هیچ یا چند ورودی 2- خروجی : حداقل یک خروجی

qabil
Télécharger la présentation

ساختمان داده ها و الگوریتم

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. جلسه اول و دوم به نام خداوند هستی بخش یگانه ساختمان داده ها و الگوریتم Data Structures and Algorithms A.M. Safaei

  2. جلسه اول الگوریتم • الگوریتممجموعه ای از دستورالعمل ها برای حل یک مسئله می باشد که دارای شرایط زیر می باشد: 1- ورودی : هیچ یا چند ورودی 2- خروجی : حداقل یک خروجی 3- قطعیت (دقیق باشند): افراد مختلف برداشت واحدی از دستورات الگوریتم داشته باشند. 4- خاتمه پذیری : دستورات الگوریتم پس از طی مراحل مشخص شده ای خاتمه یابد • الگوریتم توسط زبان های برنامه نویسی پیاده سازی می شوند • مجموعه ای از دستورات یک زبان برنامه نویسی که یک الگوریتم را پیاده سازی می کند برنامه گفته می شود.

  3. جلسه اول تحلیل الگوریتم • هدف از تحلیل یک الگوریتم بررسی الگوریتم از لحاظ توانایی حل مسئله و کارایی آن الگوریتم می باشد. • بررسی کارایی یک الگورتیم 1- زمان اجرا (سرعت اجرا) 2- میران حافظ مصرفی 3- تعداد عملیات ورودی و خروجی 4- پهنای باند مصرفی و ... • « در اکثر مواقع، ملاك اصلی در انتخاب الگوریتم ها، مدت زمان اجرای آن الگوریتم می باشد »

  4. جلسه اول تحلیل الگوریتم • عوامل مؤثر در زمان اجرای یک الگوریتم : • 1- سرعت پردازنده کامپیوتر : (موثر بصورت ثابت ) • 2- نوع کامپایلر زبان برنامه نویسی : (موثر بصورت ثابت ) • 3- اندازه داده های ورودی : (موثر برروی پیچیدگی زمانی الگوریتم) • 4- ترکیب داده های ورودی : (قابل اندازه گیری در شرایط مختلف) • 5- پیچیدگی زمانی الگوریتم

  5. جلسه اول تحلیل الگوریتم • - پیچیدگی زمانی الگوریتم : T(n) • پیچیدگی زمانی الگوریتم معیاری که مستقل از جزئیات سخت افزاري و نرم افزاري کامپیوتر اجراکننده می باشد. • تابعی است که رابطه بین تعداد عملیات الگوریتم و اندازه ورودی را بیان می کند. • یعنی تعداد عملیاتی که الگوریتم مورد نظر به ازای اندازه ورودی n انجام می دهد. • تابع زمانی الگوریتم حاصل از شمارش خطوط ( گام های ) آن الگوریتم محاسبه می شود. T(n)

  6. جلسه اول تحلیل الگوریتم شمارش گام های الگوریتم جهت شمارش گام های یک الگوریتم باید موارد زیر را در نظر گرفت : 1- تعاریف : 1- تعریف توابع و زیربرنامه ها : دارای گام صفر procedure p(..) و function f(..) و void f(..) و type f(..) 2- شروع و پایان بدنه } و {:دارای گام صفر 3- تعریف متغیرها : • در صورتی که مقدار دهی شده باشد : یک گام تعداد گام int x=0 1 • در صورتی که مقدار دهی نشده باشد : گام صفر تعداد گام int x  0

  7. جلسه اول تحلیل الگوریتم شمارش گام های الگوریتم 2- دستورات ترتیبی این دستورات فقط یکبار اجرا می شوند و شامل دستورات محاسباتی ، ورودی و خروجی و جایگزینی می باشند. مثال: • تعداد گام x= x+2  1 • تعداد گام write(x);  1 • تعداد گام return x;  1

  8. جلسه اول تحلیل الگوریتم شمارش گام های الگوریتم 3- دستورات شرطی : if, switch تعداد گام در دستورات شرطی if: 1+ درست یا غلط بودن شرط دارد تعداد گام در دستورات شرطی switch: 1+ ماکزیمم گام حالت های ساختار switch مثال :

  9. جلسه اول تحلیل الگوریتم شمارش گام های الگوریتم 4- دستورات تکرار ساده (شمارشی) : دستورات بیش از یکبار اجرا می شوند.

  10. جلسه اول تحلیل الگوریتم تمرین شمارش گام دستورات زیر بدست آورید: for ( i=5; i<=n; i++) { x=x+1; y=y+3; }

  11. جلسه اول تحلیل الگوریتم شمارش گام های الگوریتم 5- دستورات تکرار شرطی : while( ): تعداد تکرار دستورات، هیچ یا بیش از یکبار اجرا می باشد. • تعداد دفعات اجرای بدنه حلقه while() نامعلوم می باشد و بستگی به عملیات صورت گرفته بدنه حلقه، شرط خاتمه حلقه و وضعیت داده های ورودی الگوریتم دارد. • تعداد تکرار حلقه هایی که شمارنده آنها در عددی ضرب یا تقسیم می شوند تقریبا برابر است با لگاریتم n در مبنای آن عدد

  12. جلسه اول تحلیل الگوریتم تمرین

  13. جلسه اول تحلیل الگوریتم محاسبه تابع زمانی الگوریتم T(n) T(n)= c1 + c2(n+1) + c3n در صورتی که فرض شود c بیشترین مقدار بین c1, c2, c3 باشد T(n)= c+c(n+1)+cn = c(2n+1)

  14. جلسه اول تحلیل الگوریتم تمرین تابع زمانی T(n) عبارت زیر را محاسبه کنید x=0; for(i=0;i<n;i++) for(j=0; j<n;j++) x++;

  15. جلسه دوم تحلیل الگوریتم مرتبه اجرائی الگوریتم • برای محاسبه زمان اجرا و کارائی یک الگوریتم نیاز به عملیاتی است که مستقل از کامپیوتر و زبان برنامه نویسی باشد با توجه به اینکه T(n) تابعی است که در زبان های برنامه نویسی مختلف ممکن است متفاوت باشد. بنابراینT(n) معيار مناسبی برای مقایسه الگوریتم ها نيست. • تابع F (n) بعنوان مرتبه اجرائی و یا پیچیدگی زمانی الگوریتم با سه نماد زیر نمایش می دهد. • نماد Big-O (حد بالا) • نماد Big-Ω(حدپائین) • نماد  ( حد متوسط)

  16. جلسه دوم تحلیل الگوریتم مرتبه اجرائی الگوریتم اٌی بزرگ Big-oh یا نماد (O) ( حد بالا) • برای بررسی ميزان رشد توابع زمانی الگوريتم‌ها، نماد Big-oh را بکار می‌برند و آنرا با علامت O نمايش می‌دهند. • T(n)O(f(n)) ‌اگر و فقط اگر ثابت C و ثابت صحيح no وجود داشته باشند که برای همه مقادير nno، داشته باشيم T(n)Cf(n). • نماد O یک کران بالا برای مرتبه اجرائی می باشد. • در حالت کلی f(n) مرتبه زمانی اجرای الگوريتم و یا اصطلاحاً پيچيدگی زمانی الگوريتم نيز ناميده می‌شود و با O(f(n)) نمايش داده می‌شود.

  17. جلسه دوم تحلیل الگوریتم مرتبه اجرائی الگوریتم ( نماد (O) ) • قضیه اگر باشد بنابراین خواهد بود. • در تابع زمانی نماد (O) باید جمله با بیشترین مرتبه را درنظر بگیریم و ضرایب جملات تاثیری در مرتبه زمانی الگوریتم ندارد. • کاربرد نماد O جهت نشان دادن حد بالا برای نرخ رشد توابع می باشد، یعنی نرخ رشد تابع f کوچکتر یا مساوی نرخ رشد تابع g است بعبارت دیکر تابع f حداکثر با سرعتی برابر با تابع g رشد خواهد کرد. • این نماد حدبالائی برای تابع (f(n می‌دهد و وقتی بکار می‌رود که رفتار الگوریتم بدترین حالت و بیشترین زمان اجرا را برای مقادیر داشته باشد.

  18. جلسه دوم تحلیل الگوریتم مرتبه اجرائی الگوریتم ( نماد (O) ) مثال : حد بالایی برای نرخ رشد تابع T(n) را بدست آورید. در این مثال باید ثابت کنیم ,nno، T(n)Cf(n). در نظر می گیریم و با حل نامساوی زیر مقادیر c , n0 را پیدا می کنیم. هدف از حل معادله ، پیدا کردن مقادیری برای c , n0 می باشد • پیدا کردن تنها یک مقدار برای c , n0 برای اثبات کفایت می کند

  19. جلسه دوم تحلیل الگوریتم مرتبه اجرائی الگوریتم (نماد (O) ) مثال : زمان اجرای T(n) مربوط به تعدادی الگوريتم موجود است مرتبه يا پيچيدگی زمانی اين الگوريتم‌ها را محاسبه نماييد.

  20. جلسه دوم تحلیل الگوریتم تمرین درستی یا نادرستی عبارات زیر را ثابت کنید • T(n)= (n+1) 2O(n2) • T(n)= 3n3 + 2n2 O(n3) • T(n)= 5n O(n2)

  21. جلسه دوم تحلیل الگوریتم خصوصیات نماد (O) 1- خواص حدی : 2- خاصیت بازتابی : 3- خواص تعدی (تراگذاری) :

  22. جلسه دوم تحلیل الگوریتم خصوصیات نماد (O) 1- سایر خواص

  23. جلسه دوم تحلیل الگوریتم اٌمگای بزرگ Big- Ω: نماد (Ω) ( حد پائین) • تعريف: T(n) (f(n)) ‌اگر و فقط اگر ثابت C و ثابت صحيح no وجود داشته باشند که برای همه مقادير nno، داشته باشيم T(n)  Cf(n). • نماد Ω یک کران پائین برای مرتبه اجرائی می باشد  و وقتی بکار می‌رود که رفتار الگوریتم بهترین حالت و کمترین زمان اجرا را برای مقادیر معین ورودی دارد

  24. جلسه دوم تحلیل الگوریتم اٌمگای بزرگ Big- Ω: نماد (Ω) ( حد پائین) مثال : (f(n)) الگوریتم های زیر را بدست آورید. C = a , n=1 an2 +bn +c  an2 T(n) (f(n)) T(n)  Cf(n) C = 1 , n=1 T(n) (f(n)) T(n)= n4 +5n2: n4 +5n2 n4 T(n)  Cf(n)

  25. جلسه دوم تحلیل الگوریتم تمرین • درستی عبارات زیر را برای T(n) داده شده ثابت کنید. 2- T(n)= 3n+2 (n2)

  26. جلسه دوم تحلیل الگوریتم خصوصیات نماد (Ω) 1- خواص حدی : 2- خاصیت بازتابی : 3- خاصیت تعدی (تراگذاری) :

  27. جلسه دوم تحلیل الگوریتم خصوصیات نماد (Ω) 1- سایر خواص :

  28. جلسه دوم تحلیل الگوریتم تتا: نماد ( ) ( حد متوسط) • تعريف: T(n) (f(n)) ‌اگر و فقط اگر ثابت‌های C1 و C2 و ثابت صحيح n0 وجود داشته باشند که برای همه مقادير nn0:C1f(n)  T(n)  C2f(n). • قضیه : بعبارتی  دقیقا برابراست با درجه بزرگترین جمله • این نماد حدمتوسطی برای تابع (f(n می‌دهد و زمان اجرای الگوریتم را به صورت میانگینی از تعداد عملیات انجام شده با کلیه نمونه ورودی‌های مسئله نشان می‌دهد.

  29. جلسه دوم تحلیل الگوریتم نماد ( ) • مثال : اگر T(n)=n2/2-3n باشد (f(n)) را محاسبه نماييد. حل: نشان می‌دهيم که T(n)(n2) می‌باشد. • باید C1 , C2 , n0وجود داشته باشند بطوری که : T(n)(n2)  C1n2  n2/2-3n  C2n2 C1  1/2-3/n  C2 • طرف راست به ازای C2  ½ و n  1 برقرار است. • طرف چپ به ازای C1  ¼ و n  7 برقرار است. • بنابراين به ازای C1  ¼ و C2  ½ و n  7 عبارت T(n)(n2) خواهد بود. طبق تعريف تقسیم بر n2

  30. جلسه دوم تحلیل الگوریتم نماد ( ) تمرین • درستی عبارات زیر را ثابت کنید • T1(n)= 6n +4 (n) • T2(n)= 3n +6 (n2) حل : T1(n) • طرف راست معادله به ازای C2=8 و n0=2 و طرف چپ معادله به ازای C1=6 و n0=1 همواره برقرار است لذا کل معادله به ازای C1=6 و C2=8 و n0  2 همواره برقرار است.

  31. جلسه دوم تحلیل الگوریتم خصوصیات نماد () 1- خواص حدی : 2- خاصیت بازتابی : 3- خاصیت تعدی ( تراگذاری): 4- خاصیت تقارنی : 5- سایر خواص :

  32. جلسه دوم تحلیل الگوریتم نمودارهای هندسی نمادهای O ،  ، Ω

  33. جلسه دوم تحلیل الگوریتم آشنایی با خواص عملگر ریاضی سیکما Ʃ • برای تحلیل حالتهای پیچیده یک الگوریتم می توان به جای هر حلقه از سیگما استفاده کرد و در نهایت حاصل سیگما را محاسبه کرد.

  34. جلسه دوم تحلیل الگوریتم تحلیل الگوریتم : محاسبه مرتبه اجرائی حلقه های تو در تو 1- حلقه های تو در تو مستقل از هم تعداد تکرار دستوارت داخل حلقه = ضرب تعداد تکرارهای دو حلقه مثال: for(i=1;i<=n;i++) for(j=1; j<=n;j++) body; ****************** n × n = n² O(n2)

  35. جلسه دوم تحلیل الگوریتم تحلیل الگوریتم : محاسبه مرتبه اجرائی حلقه های تو در تو 2- حلقه های تو در تو وابسته به هم تعداد تکرار حلقه داخلی وابسته به متغیر حلقه بیرونی می باشد مثال: for(i=1;i<=n; i++) for(j=1; j<=I; j++) body; نکته : 1- مرتبه اجرایی حلقه های تودرتو چه مستقل و چه وابسته در یکدیگر ضرب می شوند. 2- مرتبه اجرایی حلقه های جدا از هم با یکدیگر جمع می شوند.

  36. جلسه دوم تحلیل الگوریتم چند نکته جهت محاسبه مرتبه اجرائی الگوریتم • اگر الگوریتم کار ثابتی انجام دھد پيچيدگی (مرتبه اجرائی ) آن برابر است با O(1) • اگر در عملیات الگوریتم تکرار موجود باشد و تکرار به ورودی وابسته باشد مرتبه اجرائی آن بر حسب n محاسبه شده و فقط به بررسی سنگین ترین عملیات می پردازیم بعنوان مثال دستورات تکرار سنگین ترین عملیات در یک الگوریتم می باشند. مثال: for (i=0;i<n;i++) x++; for (j=0;j<m;j++) x++ ************* O(n+m) x++; Cout << “snu.ir” ************* O(1) for (i=0;i<n;i++) x++; ************* O(n)

  37. جلسه دوم تحلیل الگوریتم • If (x==t) • for (j=0;j<n;j*=2) • x++ • else • cout<<“snu.ir” • ************* • ?? for (i=0;i<n;i++) for (j=0;j<m;j++) x++ ************* ?? تمرین :

  38. جلسه دوم تحلیل الگوریتم الگوریتم ها معمولا به دو دسته تقسیم می شوند : 1- الگوریتم های ترتیبی ( غیربازگشتی) • الگوریتم مرتب سازی حبابی • الگوریتم جستجوی ترتیبی ( خطی) • مرتبه زمانی اجرای یک الگوریتم ترتیبی برابر با مرتبه قسمتی از برنامه است که بیشترین زمان را دارا می باشد. 2- الگوریتم های بازگشتی • الگوریتم بازگشتی تابع فاکتوریل • الگوریتم بازگشتی سری فیبوناچی • الگوریتم بازگشتی برج هانوی

  39. جلسه دوم تحلیل الگوریتم الگوریتم های بازگشتی • الگوريتمی که بصورت مستقيم يا غيرمستقيم خود را فراخوانی می‌کند. • دو ويژگی اساسی الگوريتم ‌های بازگشتی : • فراخوانی بازگشتی : • عمل فراخوانی • بازگشت از عمل فراخوانی • شرط تو قف ( با استفاده از if ) if ( به حالت توقف رسیدی) مسئله حالت توقف را حل کن else تابع را بار دیگر فراخوانی کنی

  40. جلسه دوم تحلیل الگوریتم روش بازگشتی تابع فاکتوریل این تابع آنقدر خود را با یک مقدار کمتر فراخوانی می کند تا به صفر برسد که در نهایت مقدار یک را به حل فراخوانی قبلی باز می گرداند. مدل ریاضی f(3) = 3 * f(3 − 1)= 3 * f(2)= 3 * 2 * f(2 − 1)= 3 * 2 * f(1)= 3 * 2 * 1 * f(1 − 1)= 3 * 2 * 1 * f(0)= 3 * 2 * 1 * 1= 6 int fact ( int n) { if ( n = = 0) return 1 ; else return( n * fact ( n – 1) ) ; }

  41. جلسه دوم تحلیل الگوریتم تمرین : روش بازگشتی الگوریتم های سری فیبوناچی و برج هانوی را بررسی نمایید.

  42. جلسه دوم تحلیل الگوریتم پیچیدگی زمانی الگوریتم های بازگشتی • منظور از پیچیدگی زمانی یا مرتبه اجرائی یک تابع بازگشتی این است که تابع در حالت کلی n چند بار فراخوانی می شود. • اگر تابعی بصورتf(n-m) باشد، : بار عمل فراخوانی صورت می گیرد و مرتبه اجرائی برابر است با • اگر تابعی بصورت باشد عمل فراخوانی بار صورت می گیرد و مرتبه اجرائی برابر است با • اگر تابعی بصورت f(n)= f(n-1)+f(n-1) عمل فراخوانی 2n بار صورت می گیرد و مرتبه اجرائی برابر است با O(2n) • اگر تابعی بصورت f(n)= f(n-2)+f(n-2) عمل فراخوانی 2n/2 بار صورت می گیرد و مرتبه اجرائی برابر است با O(2n/2)

  43. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش تکرار و جایگذاری در این روش با استفاده از جایگزاری های متوالی می توان جواب مناسب را تولید کرد. مثال: پیچیدگی زمانی تابع روبه رو را بدست آورید. T(n)=T(n-2)+d =(T(n-4)+d)+d=T(n-4)+2d = . . . =T(n-2i)+id (1) رابطه روبه رو را تا زمانيکه به T(2) نرسيده‌ايم ادامه مي‌دهيم. بنابراين اگر n-2i به عدد 2 برسد، آنگاه T(2) حاصل می ‌شود: n-2i=2  i=(n-2)/2(2) (1),(2)  T(n) = T(2)+(n-2)/2*d C + (n-2)/2*dبنابراين T(n)O(n).

  44. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش تکرار و جایگذاری مثال: پیچیدگی زمانی تابع روبه رو را بدست آورید. , T(1)=c T(n) = 2T(n/2)+d = 2(2T(n/2/2)+d)+d  4T(n/4)+3d = . . .  2i T(n/2i )+(2i -1)d (1) رابطه را آنقدر ادامه مي‌دهيم تا به T(1) برسيم n/2i=1  i=logn2(2) • (1),(2)  • T(n)  Cn + (n-1)dبنابراين T(n)O(n)

  45. جلسه دوم تحلیل الگوریتم • تمرین : پیچیدگی زمانی تابع روبه رو با روش تکرار با جایگذاری را بدست آورید.

  46. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش حدس و استقرا مثال: پیچیدگی زمانی تابع روبه رو را بدست آورید. • فرض کنيد c1 و c2 برابر 1 باشد. • با بررسی چند مقدار اول يک راه حل کانديد به دست آوريد. • حدس می ‌زنيم که: T(n)= n+1بنابراين T(n)O(n)

  47. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش قضیه اصلی این روش برای حل مسائل بازگشتی که به فرم زیر بیان شده اند می باشد. • در این رابطه اگر داریم: • If a>bk : • If a=bk : • If a<bk :

  48. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش قضیه اصلی این روش برای حل مسائل بازگشتی که به فرم زیر بیان شده اند می باشد. • در این رابطه اگر داریم: • If : • If : • If a=b :

  49. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش قضیه اصلی مثال 1: مرتبه اجرائی تابع بازگشتی زیر را بدست آورید. • در این رابطه اگر لذا k=0 و a=2, b=2 و شرط a>bkبرقرار می باشد لذا :

  50. جلسه دوم تحلیل الگوریتم حل روابط بازگشتی به روش قضیه اصلی مثال 2: مرتبه اجرائی تابع بازگشتی زیر را بدست آورید. • a=4, b=2,

More Related