Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
این الگوریتم ضریب دو جمله ای هست . ضریب دو جمله ای به صورت زیر هست :
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
C(n,k)= n!/k!(n-k)! 0<= k =< n
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
البته این تعریف نسبتا خوبی از ضریب دو جمله ای هست ولی خب اگه n و k خیلی بزرگ باشن ، شاید خیلی سخت بشه از این فرمول استفاده کرد . برای همین میتونیم از روابط دیگری هم استفاده کنیم .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
این رابطه ی بالا ، اساس الگوریتم بازگشتی برای محاسبه ی ضریب دو جمله ای هست . این الگوریتم جزء روش تقسیم و حل محسوب میشه :
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
کارایی این الگوریتم بسیار کم هست .. دقیقا شبیه الگوریتم بازگشتی برای محاسبه ی جمله ی n ام دنباله ی فیبوناچی که دارای پیچیدگی زمانی نامناسبی بود . مشکل هم تا حدی مشابه هست . توی چنین الگوریتم هایی ممکنه یک نمونه چندین بار به طور جداگانه محاسبه بشه . و همین امر میتونه باعث کاهش شدید کارایی الگوریتم بشه .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
اما حالا همین رو میخوایم با استفاده از برنامه ریزی پویا توضیح بدیم . ایده ی ما تقریبا مثل الگوریتم بازگشتی هست ولی سعی میکنیم ماتریسی تعریف کنیم مثل M به طوریکه M[i][j] حاوی C(i,j) باشه .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
پس اول یک ویژگی بازگشتی تعریف می کنیم . دقیقا همون ویژگی که در الگوریتم بازگشتی دیده شد .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
حالا کافیه ماتریس رو به شیوه ی پایین به بالا پر کنیم . یعنی با شروع از سطر صفرم . اگر دقت کنیم در این ماتریس میبینم که مثلت خیام _پاسکال در حال شکل گیری هست . هرکدوم از سطر ها هم از روی سطر قبلیشون در حال ساخته شدن هستن . اگر ماتریس خودمون رو nXk در نظر بگیریم ، عنصر M[n][k] همون C(n,k) خواهد بود . برای اینکه این موضوع رو متوجه بشیم یک مثال میگیم و بعد میریم سراغ الگوریتمش .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
مثلا فرض کنید که بخوایم C(3,2) رو حساب کنیم . خب میایم شروع میکنیم به دست آوردن درایه های ماتریس از سطر صفرم .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
M[0][0]= 1
M[1][0]=1
M[1][1]=1
M[2][0]=1
M[2][1]=M[1][0]+M[1][1]=1+1=2
M[2][2]=1
M[3][0]=1
M[3][1]=M[2][0]+M[2][1]=1+2=3
M[3][2]=M[2][1]+M[2][2]=2+1=3
M[1][0]=1
M[1][1]=1
M[2][0]=1
M[2][1]=M[1][0]+M[1][1]=1+1=2
M[2][2]=1
M[3][0]=1
M[3][1]=M[2][0]+M[2][1]=1+2=3
M[3][2]=M[2][1]+M[2][2]=2+1=3
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
پس جواب برابر با 3 هست .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
⚡️البته دو نکته رو باید گفت:
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
یکی اینکه ممکنه به نظر بیاد این راه حل طولانی هست و بهتر بود از تعریف اصلی این رو حل کنیم . باید بگم که درسته ولی اینجا اعداد ما کوچک بودند و اگر اعداد بزرگ بشن نمیتونیم دستی حساب کنیم بنابراین باید با استفاده از یک برنامه اینکارو بکنیم . برنامه و الگوریتم هم باید کارآمد باشه . تعریف اصلی نمیتونه الگوریتم کارآمدی به ما بده و ما از این روش برای رسیدن به الگوریتم کارآمد استفاده میکنیم .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
نکته ی دیگه هم اینکه ما گفتیم ماتریس باید تشکیل بدیم . اما احتمالا متوجه شدید که این ماتریس کاملا پر نمیشه . این یک ماتریس تقریبا پایین مثلثی هست . و ما اصلا با برخی از درایه ها کاری نداریم .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
بریم سراغ الگوریتم :
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
در این روش هر نمونه ی کوچکتر فقط یکبار محاسبه میشه و راه رو برای محاسبه ی نمونه های بزرگتر هموار میکنه . پیچیدگی این الگوریتم از مرتبه ی nk هست .
Forwarded from آموزش برنامه نویسی - از مبتدی تا حرفه ای
یک الگوریتم معروف برای روش برنامه ریزی پویا هم الگوریتمی به نام "فلوید " هست . هدف این الگوریتم یافتن کوتاهترین مسیر بین دو نقطه هست . یکی از کاربرد های این الگوریتم هم در زمینه ی حمل و نقله و یکی از بهترین موضوعاتی هم که میشه از اون برای فهم بهتر این الگوریتم استفاده کرد ، مبحث گرافه . ما اینجا فقط به بیان الگوریتم و پیچیدگی اون می پردازیم.