420 likes | 682 Views
درس طراحی الگوریتم ها (با شبه کد های c ++ ). تعداد واحد: 3 تهیه کننده : جعفر پورامینی منبع : کتاب طراحی الگوریتمها مترجم : جعفر نژاد قمی. فصل اول کارایی ، تحلیل و مرتبه الگوریتم ها. این کتاب در باره تکنیک های مربوط به حل مسائل است. تکنیک ، روش مورد استفاده در حل مسائل است.
E N D
درس طراحی الگوریتم ها(با شبه کد های c ++) تعداد واحد: 3 تهیه کننده : جعفر پورامینی منبع : کتاب طراحی الگوریتمها مترجم : جعفر نژاد قمی
فصل اول کارایی ، تحلیل و مرتبه الگوریتم ها
این کتاب در باره تکنیک های مربوط به حل مسائل است. • تکنیک ، روش مورد استفاده در حل مسائل است. • مسئله ، پرسشی است که به دنبال پاسخ آن هستیم.
بکار بردن تکنیک منجر به روشی گام به گام (الگوریتم ) در حل یک مسئله می شود. • منظورازسریع بودن یک الگوریتم، یعنی تحلیل آن از لحاظ زمان و حافظه.
مثالی از یک مسئله: تعیین کنید که آیا عدد x در لیست s متشکل از n عدد وجود دارد یا خیر؟ • پارامترهای این مسئله: مسئله مقادیر خاصی به آنها انتساب می دهد. s, n, x • الگوریتم: روال قدم به قدم برای حل همه نمونه ها
نوشتن الگوریتم به زبان فارسی دو ایراد دارد: 1- نوشتن الگوریتم های پیچیده به این شیوه دشوار است. 2- مشخص نیست از توصیف فارسی الگوریتم چگونه می توان یک برنامه کامپیوتری ایجاد کرد.
الگوریتم 1-1: جست و جوی ترتیبی Void seqsearch ( intn const keytypeS[ ] keytypex, index& location) { location = 1; while (location <= n && S[location] ! = x) location++; if (location > n ) location = 0 ; } هدف ارائه الگوریتم واضح، قابل فهم و مستقل از زبان برنامه نویسی است
الگوریتم 2-1:محاسبه مجموع عناصر آرایه number sum (int n , const number s[ ]) { index i; number result; result = 0; for (i = 1; i <= n; i++) result = result + s[i]; return result; }
الگوریتم 3-1:مرتبسازی تعویضی مسئله: n کلید را به ترتیب غیر نزولی مرتب سازی کنید. void exchangesort (int n , keytype S[ ]) { index i,j; for (i = 1 ; i<= n -1; i++) for (j = i +1; j <= n ; j++) if ( S[j] < S[i]) exchange S[i] and S[j]; }
الگوریتم4-1:ضربماتریس ها voidmatrixmult (int n const number A [ ] [ ], const number B [ ] [ ], number C [ ] [ ], { index i , j, k; for ( i = 1; I <= n ; i++) for (i = 1; j <= n ; j++) { C [i] [j] = 0; for (k = 1 ; k <= n ; k++) C [i][j] = C[i] [j] + A [i][k] * B [k][j] } }
2- 1اهمیت ساخت الگوریتم های کارآمد • جست و جوی دودویی معمولا بسیار سریع تر ازجست و جوی ترتیبی است. • تعداد مقایسه های انجام شده توسط جست و جوی دودویی برابر با lg n + 1 است .
الگوریتم 1-1: جست و جوی ترتیبی Void seqsearch ( int n const keytype S[ ] keytype x, index& location) { location = 1; while (location <= n && S[location] ! = x) location++; if (location > n ) location = 0 ;
الگوریتم 5-1:جست و جوی دودویی Void binsearch (int n, const keytype S[ ], keytype x, index& location) { index low, high, mid; low = 1 ; high = n; location = 0; while (low <= high && location = = 0) { mid = Į(low + high)/2⌡;
if ( x = = S [mid]) location = mid; else if (x < S [mid]) high = mid – 1; else low = mid + 1; } }
جست وجوی دودویی-تحلیل • در داخل حلقه با یک پیاده سازی مناسب یک مقایسه داریم. • بیشترین تعداد مقایسه: x از همه کوچک و یا از همه بزرگتر • اگر n=32 و x از همه بزرگتر: مقایسه با اندیسهای 16، 24، 28، 30، 31، 32 • تعداد کل مقایسه: lg n + 1
الگوریتم 6-1: جمله n ام فیبوناچی (بازگشتی) مسئله : جمله n ام از دنباله فیبوناچی را تعیین کنید. int fib (int n) { if ( n <= 1) return n; else return fib (n – 1) + fib (n – 2); }
الگوریتم 7-1:جملهnام فیبوناچی (تکراری) int fib2 (int n) { index i; int f [0..n]; f[0] = 0; if (n > 0) { f[1] = 1; for (i = 2 ; I <= n; i++) f[i] = f [i -1] + f [i -2]; } return f[n]; }
جمله n ام فیبوناچی (بازگشتی)-تحلیل • تعداد جملات محاسبه شده برای fib(n) • بطور مثال برای محاسبه fib(5) تعداد 15 فراخوانی انجام می شود.(شکل درخت درج شود)
جمله n ام فیبوناچی (بازگشتی)-تحلیل • اگر T(n) تعداد جملات در درخت بازگشتی باشد آنگاه T(n) >2 × T(n-2) T(n)> 2 ×2 ×T(n-4) ... T(n)> 2n/2 ×T(0)= 2n/2
3-1 تحلیل الگوریتم ها • برای تعیین میزان کارایی یک الگوریتم را باید تحلیل کرد. 1-3-1 تحلیل پیچیدگی زمانی • تحلیل پیچیدگی زمانی یک الگوریتم ، تعیین تعداد دفعاتی است که عمل اصلی به ازای هر مقدار از ورودی انجام می شود. • اندازه ی ورودی: اندازه آرایه، تعداد سطرها، تعداد یال و نود و .... بسته به مسئله
T(n) را پیچیدگی زمانی الگوریتم در حالت معمول می گویند. • W(n) را تحلیل پیچیدگی زمانی در بدترین حالت می نامند. • A(n) را پیچیدگی زمانی در حالت میانگین می گویند.
تحلیل پیچیدگی زمانی برای حالت معمول برای الگوریتم(جمع کردن عناصرآرایه) عمل اصلی:افزودن یک عنصر از آرایه به sum. اندازه ورودی:n، تعداد عناصر آرایه. T(n) = n
تحلیل پیچیدگی زمانی برای حالت معمول برای الگوریتم(مرتب سازی تعویضی) عمل اصلی:مقایسه S [j] با S[i] . اندازه ورودی:تعداد عناصری که باید مرتب شوند. T(n) = n(n -1) /2
تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم(جست و جوی ترتیبی) عمل اصلی:مقایسه یک عنصر آرایه با x. اندازه ورودی:, n تعداد عناصر موجود در آرایه. W (n) = n
تحلیل پیچیدگی زمانی در بهترین حالت برای الگوریتم(جست وجوی ترتیبی) عمل اصلی:مقایسه یک عنصر آرایه با x. اندازه ورودی:, n تعداد عناصر آرایه. B (n) = 1
4-1مرتبه الگوریتم • الگوریتم ها یی با پیچیدگی زمانی ازقبیل n و100n را الگوریتم های زمانی خطی می گویند. • مجموعه کامل توابع پیچیدگی را که با توابع درجه دوم محض قابل دسته بندی باشند، n²)(θمی گویند.
مجموعه ای ازتوابع پیچیدگی که با توابع درجه سوم محض قابل دسته بندی باشند، n³)(θنامیده می شوند. • برخی از گروه های پیچیدگی متداول در زیر داده شده است: θ(lg n)< θ (n) < θ (n lg n) < θ (n²) < θ (n³) <θ (2 ⁿ)
2-4-1آشنایی بیشتر بامرتبه الگوریتم ها • برای یک تابع پیچیدگی مفروض ƒ(n) ،O (ƒ (n))”O بزرگ“ مجموعه ای از توابع پیچیدگی g (n) است که برای آن ها یک ثابت حقیقی مثبت c و یک عدد صحیح غیر منفی N وجود دارد به قسمی که به ازای همه ی N =< n داریم: g (n) >= c × ƒ (n)
برای یک تابع پیچیدگی مفروض ƒ(n) ، (Ω (ƒ(n)مجموعه ای از توابع پیچیدگی g (n) است که برای آن ها یک عدد ثابت حقیقی مثبت c و یک عدد صحیح غیر منفی N وجود دارد به قسمی که به ازای همه ی N =< n داریم: g (n) =< c × ƒ (n)
برای یک تابع پیچیدگی مفروض ƒ(n)، داریم: θ (ƒ(n)) = O (ƒ(n)) ∩Ω (ƒ(n)) یعنی θ(ƒ(n)) مجموعه ای از توابع پیچیدگی g (n) است که برای آن ها ثابت های حقیقی مثبت c وd و عدد صحیح غیر منفی N وجود دارد به قسمی که : c × ƒ (n) <= d × ƒ(n)
برای یک تابع پیچیدگی ƒ(n) مفروض،( o(ƒ(n) ”o کوچک” عبارت ازمجموعه کلیه توابع پیچیدگیg (n) است که این شرط را برآورده می سازند : به ازای هرثابت حقیقی مثبت c ،یک عدد صحیح غیر منفی N وجود دارد به قسمی که به ازای همه ی N =< n داریم: g (n) =< c × ƒ (n)
مثال • در شکل زیر نشان می دهد که n2+10n از مرتبه O(n2) می باشد
مثال • چند عضو از مجموعه های On2Ωn2 θn2
ویژگی های مرتبه 1-O (ƒ(n))Єg (n) اگروفقط اگر.ƒ (n) ЄΩ (g(n)) 2-(ƒ(n))θЄg (n) اگروفقط اگرƒ (n) Єθ (g (n)). 3- اگر b >1 و a > 1، در آن صورت: log ⁿaЄθ (log ⁿb) 4- اگر b > a > 0،در آن صورت: aⁿЄ o (bⁿ)
5- به ازای همه ی مقادیر a > 0 داریم : aⁿЄ o (n!) 6- اگرc >= 0، d >0 ، g (n) Є o (ƒ(n)) و h(n) Є θ(ƒ(n)) باشد، درآن صورت: c × g(n) + d × h (n) Єθ (ƒ(n))
7- ترتیب دسته های پیچیدگی زیر را در نظربگیرید: θ (lg n) θ (n) θ(n lg n) θ(n²) θ(n^j) θ (n^k) θ (aⁿ) θ (bⁿ) θ (n!) که در آن k > j > 2 و b > a > 1 است. اگر تابع پیچیدگی g (n) در دسته ای واقع در طرف چپ دسته ی حاوی ƒ (n) باشد، در آن صورت: g (n) Є o (ƒ(n))
تمرینات • سوال 12، 17، 19، 26، 27، 28، 29، 32