انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: adel1368 در 17 آذر 1391، 08:58 ب‌ظ

عنوان: کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 17 آذر 1391، 08:58 ب‌ظ
با سلام:

 من این طراحی الگوریتم رو نمی تونم خوب یاد بگیرم دوستان میتونن مرجعی

رومعرفی کنن برای یادگیریش 


 بجز این کتاب
طراحی الگوریتم ها

تالیف :
ریچارد نپولیتان
کیمرث  نعیمی پور


دوستان اگه لطف کنن امتحانات داره کمکم شروع میشه
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: کیان در 18 آذر 1391، 12:25 ق‌ظ
زبان غیرمادری مسلطی؟
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 18 آذر 1391، 10:56 ق‌ظ
منظورتون انگلیسی باشه

آره میتونم بخونم
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: 不眠症 در 18 آذر 1391، 01:50 ب‌ظ
به زبان مادری این سایت خوبه
http://www.algorithmha.ir/

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

به زبان غیر مادری
 یه کتاب خوب هست ولی چون وقت نداری توصیه نمی‌کنم
http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202/ref=sr_1_1?ie=UTF8&qid=1354961883&sr=8-1&keywords=algorithm+design+manual

اگر بیشتر نیاز داشتی بعضی سایتها هستند که به صورت پراکنده الگوریتم های مختلفی رو شرح می‌دهند بگو تا به اونها هم لینک بدم
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 18 آذر 1391، 02:40 ب‌ظ
به زبان مادری این سایت خوبه

#-o
نقل‌قول
زبان مادری من یه زبان دیگه ست

ممنون به خاطر معرفی سایت
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 18 آذر 1391، 05:04 ب‌ظ
بهترین راه آموختن یک خوارزمی ، پیاده سازی آن به زبانیست که بر ان چیره و مسلط استید.
این ترم بنده هم  این درس را دارم ، هر جا مشکل داشتید بفرمایید
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 18 آذر 1391، 05:52 ب‌ظ
مشکل اصلی من محاسبه پیچیدگی بازگشتی هاست
مثلا این:
t(n)=2t(n/2)+n-1
t(1)=0

میشه روش حل کردنش رو بگین
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: امین - am1n در 18 آذر 1391، 07:50 ب‌ظ
مشکل اصلی من محاسبه پیچیدگی بازگشتی هاست
مثلا این:
t(n)=2t(n/2)+n-1
t(1)=0

میشه روش حل کردنش رو بگین

درختش رو باید رسم کنی دیگه. آسونه ... حالا من کاغذ و مداد ندارم الان  ;D




       t (n)          ->>>  n
   t(n/2)      t(n/2)      ->>> n/2 + n/2 = n

t(n/4)   t(n/4)      ......      ->>> n/4 + n/4 + n/4 + n/4 =n


بعدش کل n هارو با هم جمع میکنی. که میشه D تا n . که D همون عمق درخته . ینی به اندازه ی D   این n ها با هم جمع میشن ... واضح بود ؟
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: سید مسعود امامیان در 18 آذر 1391، 08:08 ب‌ظ
مشکل اصلی من محاسبه پیچیدگی بازگشتی هاست
مثلا این:
t(n)=2t(n/2)+n-1
t(1)=0

میشه روش حل کردنش رو بگین

به نظرم باید ابتدا روش رو فهمید ! مثلاً عدد گذاری تا چند رقم بعد ...

کتاب زیر کتاب خیلی خوبیه (فقط 1313 صفحه است ) :
نقل‌قول

t._cormen_-_introduction_to_algorithms_3rd_edition


دریافت :


http://uplod.ir/zpstrn5ce7jz/t._cormen_-_introduction_to_algorithms_3rd_edition.pdf.htm (http://uplod.ir/zpstrn5ce7jz/t._cormen_-_introduction_to_algorithms_3rd_edition.pdf.htm)

خیلی مضحک هس که این انجمن قابلیت " اتصال فایل ضمیمه " نداره !
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 18 آذر 1391، 09:27 ب‌ظ
ممنون بخاطر کتاب




با تشکر از همه دوستان



عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 18 آذر 1391، 10:23 ب‌ظ
مشکل اصلی من محاسبه پیچیدگی بازگشتی هاست
مثلا این:
t(n)=2t(n/2)+n-1
t(1)=0

میشه روش حل کردنش رو بگین

این الگوریتم به اصطلاح از گونه ی تقسیم و غلبه (  divide and conquer )  است . برای این الگوریتم ها میانگین مرتبه را از روی فرمول زیر بدست می آوریم :
نخست فرمول را به شکل استاندارد زیر میگیریم :
t(n)  = at(n/b)+C(n^k) سپس میانگین برابر است با : if a>b^k =>n^log(a,b)
if a=b^k =>(n^k)*log(n)
if a<b^k =>n^k
چون در نمونه ای که دادید :a=2 b=2 k=1
a=b^k
میانگین مرتبه از رده :(n^k) * log(n)است . که چون k=1 برابر است با nlogn  .
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 18 آذر 1391، 10:35 ب‌ظ
مشکل اصلی من محاسبه پیچیدگی بازگشتی هاست
مثلا این:
t(n)=2t(n/2)+n-1
t(1)=0

میشه روش حل کردنش رو بگین

این الگوریتم به اصطلاح از گونه ی تقسیم و غلبه (  divide and conquer )  است . برای این الگوریتم ها میانگین مرتبه را از روی فرمول زیر بدست می آوریم :
نخست فرمول را به شکل استاندارد زیر میگیریم :
t(n)  = at(n/b)+C(n^k) سپس میانگین برابر است با : if a>b^k =>n^log(a,b)
if a=b^k =>(n^k)*log(n)
if a<b^k =>n^k
چون در نمونه ای که دادید :a=2 b=2 k=1
a=b^k
میانگین مرتبه از رده :(n^k) * log(n)است . که چون k=1 برابر است با nlogn  .
استادمون این مسئله و حل کرده بود وجوابی شما آوردید اورده بود ولی روش حلش رو نگفته منم که زیادی باهوشم نمیتونستم حلش کنم ولی الان روش حلرو دونستم

اگه زحمتی نباشه میشه یک مثال دیگه حل کنید( :oops:)
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 18 آذر 1391، 11:10 ب‌ظ
ببینید کلا این روش زمانی کاربرد داره که الگوریتم به همون شکل استانداردی که نوشتم باشه و نه شکل دیگه ای .
یعنی . این الگوریتم ها زمانی بدست میاد که توی الگوریتم ، پرسش رو بجای اینکه بیایم یکراست حل کنیم میایم یک دوم ، یک سوم ، یک دهم از اون پرسش رو حل میکنم ( بخش at(n/b) ) ، سپس میایم یک کارایی روی بخش هایی که حل کردیم و نکردیم انجام میدیم ( مثلا سرهم کردن merge ) که بخش ( C( n^K  رو میسازه . سپس میایم از روی سه شرطی که گفتم میانگین مرتبه رو بدست میاریم
الگوریتم های مرتب کردن ادغامی و سریع و اینها از این دسته است
اگر کتاب دم دستت داری بخش (( ضرب اعداد صحیح بزرگ از روش تقسیم و غلبه )) رو بخون
اونم یک نمونه از این دسته است
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 18 آذر 1391، 11:21 ب‌ظ
حالا من یک الگوریتم مینویسم ( یافتن بزرگترین عدد در یک آرایه ) شما نخست t(n) رو براش بساز سپس بگو میانگین مرتبه اش چیه :
function find_max ( T , low , high)
{
  if (low==high)
   return T[low]

  else
   if (high == low+1)
       if (T[high] > T [low])
           return T[high]
       else
           return T[low]

   else
       {
       mid=floor((high+low)/2)
       LMAX=find_max(T,low,mid)
       RMAX=find_max(T,mid+1,high)
       return MAXIMUM(LMAX,RMAX)
       }
}
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 19 آذر 1391، 01:45 ب‌ظ
حالا من یک الگوریتم مینویسم ( یافتن بزرگترین عدد در یک آرایه ) شما نخست t(n) رو براش بساز سپس بگو میانگین مرتبه اش چیه :
function find_max ( T , low , high)
{
  if (low==high)
   return T[low]

  else
   if (high == low+1)
       if (T[high] > T [low])
           return T[high]
       else
           return T[low]

   else
       {
       mid=floor((high+low)/2)
       LMAX=find_max(T,low,mid)
       RMAX=find_max(T,mid+1,high)
       return MAXIMUM(LMAX,RMAX)
       }
}
میشه روش حلش رو همبگید
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 19 آذر 1391، 04:21 ب‌ظ
خودم تو یک کد ساده موندم مثل خر
اونو ردیف کردم میگم
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 19 آذر 1391، 05:59 ب‌ظ
خودم تو یک کد ساده موندم مثل خر
اونو ردیف کردم میگم
نقل‌قول
:-X :-X

--------------------------------------------------------------------------------------
آخه ما یه استاد داریم میرسه کلاس نه سلام نه علیک ماژیک وپاکن میگره دستش اینجوری میکنه

با یه دست مینویسه
               
بایه دست دیگه پاک میکنه

حالا شانس آوردیم تو کلاس تند نویس داریم والا .............
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: سید مسعود امامیان در 19 آذر 1391، 06:05 ب‌ظ
جزوه های زیادی توی اینترنت هست ! می تونید از اون ها استفاده کنید .
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 19 آذر 1391، 07:21 ب‌ظ
function find_max ( T , low , high)
{
  if (low==high)
   return T[low]

  else
   if (high == low+1)
       if (T[high] > T [low])
           return T[high]
       else
           return T[low]

   else
       {
       mid=floor((high+low)/2)
       LMAX=find_max(T,low,mid)
       RMAX=find_max(T,mid+1,high)
       return MAXIMUM(LMAX,RMAX)
       }
}

اینجوری برهان میاریم :
نخست می بینیم الگوریتم چکار میکنه . الگوریتم میاد برای یافتن بزرگترین عدد در یک آرایه نخست نگاه میکنه ببینه آیا آرایه تک عنصر داره یا بیش از یک عنصر . اگر تک عنصر داره میاد همون تک عنصر رو به نشانه ی بزرگترین عنصر برمیگردونه
پس از اینجا در می یابیم که بهترین حالت برای این الگوریتم با یک if ساده انجام میشه . پس مرتبه این الگوریتم در بهترین حالت میشه 1 .
در حالت میانگین الگوریتم میاد آرایه رو به دو بخش میکنه
floor((high+low)/2سپس توی هر بخش بیشینه رو میابه :LMAX=find_max(T,low,mid)
RMAX=find_max(T,mid+1,high
یعنی داریم :t(n) = 2t(n/2)n/2 یعنی الگوریتم روی نیمی از درآیند ( وردوی ) کار میکنه . چون دو بار روی نیمی از ورودی کار کردیم میشه
2t(n/2)در پایان میایم بیشینه رو میان بیشینه ی  چپ و بیشینه ی راست میابیم :
return MAXIMUM(LMAX,RMAX)اینم میشه یک کار .
پس زمان مصرفی برابره با

t(n) = 2 t(n/2)+1حالا شما از روی فرمولها مرتبه میانگین این خوارزمی رو بگو
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: adel1368 در 20 آذر 1391، 10:14 ب‌ظ
ممنون از پاسخی که دادین

2تا سوال تو کد بالا از 3تاif استفاده شده یعنی مرتبه این الگوریتم (1)Oهتسش
اگه بجای if از حلقه for استفاده میکردیم اون موقع جواب چه جوری میشد

.
.
.
.
.
.
میترسم این واحدو چند ترم  پشت سرم هم بردارم (اصلا تو مخم نمیره)
عنوان: پاسخ : کمک برای یادگیری طراحی الگوریتم
ارسال شده توسط: doomhammer65ir در 22 آذر 1391، 06:05 ب‌ظ
این برهان که سه تا شرط داره پس مرتبه 1 هستش نادرسته
باید الگوریتم رو تا پایان بخونی
نخست باید بفهمی الگوریتم چکار میکنه سپس T(n) رو براش بسازی و سپس میتونی درباره ی مرتبه اش اظهار نظر کنی