زمان کنونی: ۳۰ فروردین ۱۴۰۳, ۰۴:۲۴ ب.ظ مهمان گرامی به انجمن مانشت خوش آمدید. برای استفاده از تمامی امکانات انجمن می‌توانید عضو شوید.
گزینه‌های شما (ورودثبت نام)

سوال از روش تقسیم و غلبه

ارسال:
  

kamal3401 پرسیده:

سوال از روش تقسیم و غلبه

سلام من رو این سوال زیاد فکر کردم ولی به جوابی نرسیدم میشه راهنمایی کنید؟

فرض کنید ارایه ای از n عدد صحیح داریم میخوایهم بزرگترین زیر دنباله از این اعداد را از نظر مجموع انها بدست اوریم
اگر تمامی اعداد منفی باشند جواب صفر خواهد بود! پیچیدگی الگوریتم پیشنهادی را با روش تقسیم و غلبه محاسبه کنید

برای نمونه در دنباله ی [tex]\opencurlybrace-2\: ,\: 11\: ,-4\: ,\: 13\: ,-5\: ,\: 4\: ,-6\closecurlybrace[/tex] جواب [tex]\opencurlybrace\: 11\: ,-4\: ,\: 13\closecurlybrace[/tex] 20 خواهد بود
مشاهده‌ی وب‌سایت کاربر
نقل قول این ارسال در یک پاسخ

۰
ارسال:
  

Behnam‌ پاسخ داده:

RE: سوال از روش تقسیم و غلبه

(۱۱ خرداد ۱۳۹۵ ۰۱:۴۱ ق.ظ)kamal3401 نوشته شده توسط:  سلام من رو این سوال زیاد فکر کردم ولی به جوابی نرسیدم میشه راهنمایی کنید؟

فرض کنید ارایه ای از n عدد صحیح داریم میخوایهم بزرگترین زیر دنباله از این اعداد را از نظر مجموع انها بدست اوریم
اگر تمامی اعداد منفی باشند جواب صفر خواهد بود! پیچیدگی الگوریتم پیشنهادی را با روش تقسیم و غلبه محاسبه کنید

برای نمونه در دنباله ی [tex]\opencurlybrace-2\: ,\: 11\: ,-4\: ,\: 13\: ,-5\: ,\: 4\: ,-6\closecurlybrace[/tex] جواب [tex]\opencurlybrace\: 11\: ,-4\: ,\: 13\closecurlybrace[/tex] 20 خواهد بود

عنصر وسطی آرایه رو در نظر بگیرید. زیر رشته‌ی ماکزیمم (جواب مسأله) ممکن هست دارای این عنصر باشه، ممکن هم هست نباشه.
۱) اگر زیر رشته‌ی ماکزیمم فاقد عنصر وسطی باشه، پس باید زیر رشته‌ی ماکزیمم رو در نصفه‌ی چپ و نصفه‌ی راست بگردیم.
۲) اما اگر زیر رشته‌ی ماکزیمم، دارای عنصر وسطی بود، پی باید منتهی الیه سمت چپ زیر رشته (یعنی اولین عنصر زیر رشته‌ی ماکزیمم) رو از نیمه‌ی سمت چپ بگردیم، عنصر آخر (سمت راست‌ترین عنصر) رو هم از نیمه‌ی سمت راستی بگردیم.

پس ۳ تا چیز رو پیدا میکنیم و بزرگترین اون ۳ چیز رو به عنوان جواب مسأله برمیگردونیم:
۱) بزرگترین زیررشته‌ی نیمه‌ی چپ اعداد
۲) بزرگترین زیررشته‌ی نیمه‌ی راست اعداد
فرض میکنیم عنصر وسطی هم در زیر رشته‌ی ماکزیمم هست، پس ۳) زیررشته‌ای که عنصر وسطی هم داخلش هست و کران پایینش رو طوری از نیمه‌ی چپ انتخاب میکنیم که اعداد نیمه‌ی چپ ماکزیمم باشند، کران بالاش رو هم از نیمه‌ی راست طوری انتخاب میکنیم که اون اعداد هم ماکزیمم بشه جمعش.
شبه کدش یه همچین چیزی میشه:
کد:
int maxSub(int left, int right){
   if(left == right)
      return a[left];
   int mid = (left + right)/2;
   int left_ans = maxSub(left, mid);
   int right_ans = maxSub(mid + 1, right);
   int left_max = a[mid];
   int right_max = a[mid + 1];
   int sum = 0;
   for(int i = mid; i >= left; i--){
      sum = sum + a[i];
      if(sum > left_max)
         left_max = sum;
   }
   sum = 0;
   for(int i = mid + 1; i <= right; i++){
      sum = sum + a[i];
      if(sum > right_max)
         right_max = sum;
   }
   return max(left_ans, right_ans, left_max + right_max);  
}
نقل قول این ارسال در یک پاسخ

ارسال:
  

kamal3401 پاسخ داده:

RE: سوال از روش تقسیم و غلبه

(۱۱ خرداد ۱۳۹۵ ۰۲:۳۴ ق.ظ)behnam5670 نوشته شده توسط:  
(11 خرداد ۱۳۹۵ ۰۱:۴۱ ق.ظ)kamal3401 نوشته شده توسط:  سلام من رو این سوال زیاد فکر کردم ولی به جوابی نرسیدم میشه راهنمایی کنید؟

فرض کنید ارایه ای از n عدد صحیح داریم میخوایهم بزرگترین زیر دنباله از این اعداد را از نظر مجموع انها بدست اوریم
اگر تمامی اعداد منفی باشند جواب صفر خواهد بود! پیچیدگی الگوریتم پیشنهادی را با روش تقسیم و غلبه محاسبه کنید

برای نمونه در دنباله ی [tex]\opencurlybrace-2\: ,\: 11\: ,-4\: ,\: 13\: ,-5\: ,\: 4\: ,-6\closecurlybrace[/tex] جواب [tex]\opencurlybrace\: 11\: ,-4\: ,\: 13\closecurlybrace[/tex] 20 خواهد بود

عنصر وسطی آرایه رو در نظر بگیرید. زیر رشته‌ی ماکزیمم (جواب مسأله) ممکن هست دارای این عنصر باشه، ممکن هم هست نباشه.
۱) اگر زیر رشته‌ی ماکزیمم فاقد عنصر وسطی باشه، پس باید زیر رشته‌ی ماکزیمم رو در نصفه‌ی چپ و نصفه‌ی راست بگردیم.
۲) اما اگر زیر رشته‌ی ماکزیمم، دارای عنصر وسطی بود، پی باید منتهی الیه سمت چپ زیر رشته (یعنی اولین عنصر زیر رشته‌ی ماکزیمم) رو از نیمه‌ی سمت چپ بگردیم، عنصر آخر (سمت راست‌ترین عنصر) رو هم از نیمه‌ی سمت راستی بگردیم.

پس ۳ تا چیز رو پیدا میکنیم و بزرگترین اون ۳ چیز رو به عنوان جواب مسأله برمیگردونیم:
۱) بزرگترین زیررشته‌ی نیمه‌ی چپ اعداد
۲) بزرگترین زیررشته‌ی نیمه‌ی راست اعداد
فرض میکنیم عنصر وسطی هم در زیر رشته‌ی ماکزیمم هست، پس ۳) زیررشته‌ای که عنصر وسطی هم داخلش هست و کران پایینش رو طوری از نیمه‌ی چپ انتخاب میکنیم که اعداد نیمه‌ی چپ ماکزیمم باشند، کران بالاش رو هم از نیمه‌ی راست طوری انتخاب میکنیم که اون اعداد هم ماکزیمم بشه جمعش.
شبه کدش یه همچین چیزی میشه:
کد:
int maxSub(int left, int right){
   if(left == right)
      return a[left];
   int mid = (left + right)/2;
   int left_ans = maxSub(left, mid);
   int right_ans = maxSub(mid + 1, right);
   int left_max = a[mid];
   int right_max = a[mid + 1];
   int sum = 0;
   for(int i = mid; i >= left; i--){
      sum = sum + a[i];
      if(sum > left_max)
         left_max = sum;
   }
   sum = 0;
   for(int i = mid + 1; i <= right; i++){
      sum = sum + a[i];
      if(sum > right_max)
         right_max = sum;
   }
   return max(left_ans, right_ans, left_max + right_max);  
}

خیلی ممنون توضیحات خیلی عالی بود
پیچیدگی زمانیشو هم میشه رابطه بازگشتیشو فقط بگید؟
پس ما سه تا زیر مسئله داریم؟
مشاهده‌ی وب‌سایت کاربر یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

Behnam‌ پاسخ داده:

RE: سوال از روش تقسیم و غلبه

(۱۱ خرداد ۱۳۹۵ ۰۲:۴۰ ق.ظ)kamal3401 نوشته شده توسط:  
(11 خرداد ۱۳۹۵ ۰۲:۳۴ ق.ظ)behnam5670 نوشته شده توسط:  
(11 خرداد ۱۳۹۵ ۰۱:۴۱ ق.ظ)kamal3401 نوشته شده توسط:  سلام من رو این سوال زیاد فکر کردم ولی به جوابی نرسیدم میشه راهنمایی کنید؟

فرض کنید ارایه ای از n عدد صحیح داریم میخوایهم بزرگترین زیر دنباله از این اعداد را از نظر مجموع انها بدست اوریم
اگر تمامی اعداد منفی باشند جواب صفر خواهد بود! پیچیدگی الگوریتم پیشنهادی را با روش تقسیم و غلبه محاسبه کنید

برای نمونه در دنباله ی [tex]\opencurlybrace-2\: ,\: 11\: ,-4\: ,\: 13\: ,-5\: ,\: 4\: ,-6\closecurlybrace[/tex] جواب [tex]\opencurlybrace\: 11\: ,-4\: ,\: 13\closecurlybrace[/tex] 20 خواهد بود

عنصر وسطی آرایه رو در نظر بگیرید. زیر رشته‌ی ماکزیمم (جواب مسأله) ممکن هست دارای این عنصر باشه، ممکن هم هست نباشه.
۱) اگر زیر رشته‌ی ماکزیمم فاقد عنصر وسطی باشه، پس باید زیر رشته‌ی ماکزیمم رو در نصفه‌ی چپ و نصفه‌ی راست بگردیم.
۲) اما اگر زیر رشته‌ی ماکزیمم، دارای عنصر وسطی بود، پی باید منتهی الیه سمت چپ زیر رشته (یعنی اولین عنصر زیر رشته‌ی ماکزیمم) رو از نیمه‌ی سمت چپ بگردیم، عنصر آخر (سمت راست‌ترین عنصر) رو هم از نیمه‌ی سمت راستی بگردیم.

پس ۳ تا چیز رو پیدا میکنیم و بزرگترین اون ۳ چیز رو به عنوان جواب مسأله برمیگردونیم:
۱) بزرگترین زیررشته‌ی نیمه‌ی چپ اعداد
۲) بزرگترین زیررشته‌ی نیمه‌ی راست اعداد
فرض میکنیم عنصر وسطی هم در زیر رشته‌ی ماکزیمم هست، پس ۳) زیررشته‌ای که عنصر وسطی هم داخلش هست و کران پایینش رو طوری از نیمه‌ی چپ انتخاب میکنیم که اعداد نیمه‌ی چپ ماکزیمم باشند، کران بالاش رو هم از نیمه‌ی راست طوری انتخاب میکنیم که اون اعداد هم ماکزیمم بشه جمعش.
شبه کدش یه همچین چیزی میشه:
کد:
int maxSub(int left, int right){
   if(left == right)
      return a[left];
   int mid = (left + right)/2;
   int left_ans = maxSub(left, mid);
   int right_ans = maxSub(mid + 1, right);
   int left_max = a[mid];
   int right_max = a[mid + 1];
   int sum = 0;
   for(int i = mid; i >= left; i--){
      sum = sum + a[i];
      if(sum > left_max)
         left_max = sum;
   }
   sum = 0;
   for(int i = mid + 1; i <= right; i++){
      sum = sum + a[i];
      if(sum > right_max)
         right_max = sum;
   }
   return max(left_ans, right_ans, left_max + right_max);  
}

خیلی ممنون توضیحات خیلی عالی بود
پیچیدگی زمانیشو هم میشه رابطه بازگشتیشو فقط بگید؟
پس ما سه تا زیر مسئله داریم؟

مسأله رو به دو تا جستجوی [tex]\frac{n}{2}[/tex] و دو حلقه‌ی for که هر کدوم بار اول [tex]\frac{n}{2}[/tex] هستند تبدیل میکنه:
[tex]T(n)=2T(\frac{n}{2})+\frac{n}{2}+\frac{n}{2}\longrightarrow T(n)=2T(\frac{n}{2})+n[/tex]
بله میشه ۳ زیر مسأله
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ



موضوع‌های مرتبط با این موضوع...
موضوع: نویسنده پاسخ: بازدید: آخرین ارسال
  تعداد روش های نوشتن عدد n ss311 ۲ ۲,۹۸۶ ۱۳ بهمن ۱۳۹۸ ۰۵:۲۷ ب.ظ
آخرین ارسال: ss311
  مشاوره روش تحقیق و تحلیل آماری sirvan.t ۰ ۱,۹۲۷ ۱۷ آذر ۱۳۹۸ ۱۲:۵۹ ق.ظ
آخرین ارسال: sirvan.t
  روش برنامه نویسی پویا برای حل فروشنده دوره گرد Mohammad WR10 ۶ ۱۰,۳۲۰ ۱۶ خرداد ۱۳۹۸ ۰۶:۳۲ ب.ظ
آخرین ارسال: Shadik
  روش به طرح درخت پیش ترتیب با آرایش داده شده porseshgar ۶ ۶,۰۶۳ ۱۴ بهمن ۱۳۹۷ ۰۸:۴۰ ب.ظ
آخرین ارسال: porseshgar
  روش اپلای کردن فایل patch به برنامه ای در لینوکس hanie_M ۱ ۲,۲۸۶ ۲۳ دى ۱۳۹۷ ۰۴:۰۶ ق.ظ
آخرین ارسال: one hacker alone
  تقسیم برای محاسبه کد افزونه چرخشی (CRC) Sanazzz ۴ ۶,۱۷۶ ۲۰ آذر ۱۳۹۷ ۰۱:۱۸ ب.ظ
آخرین ارسال: Sanazzz
  روش های تولید محتوا برای سایت melinaa ۰ ۱,۹۶۸ ۰۴ شهریور ۱۳۹۷ ۱۰:۳۵ ق.ظ
آخرین ارسال: melinaa
  بهترین زمان برای حل کوله پشتی به روش پویا Mr.R3ZA ۰ ۱,۹۶۴ ۱۲ خرداد ۱۳۹۷ ۰۲:۰۶ ق.ظ
آخرین ارسال: Mr.R3ZA
  بهترین زمان برای حل کوله پشتی به روش پویا Mr.R3ZA ۰ ۱,۷۴۱ ۱۱ خرداد ۱۳۹۷ ۰۷:۲۸ ب.ظ
آخرین ارسال: Mr.R3ZA
  روش های تولید محتوا برای سایت fafaferdos ۰ ۱,۷۶۸ ۲۶ اردیبهشت ۱۳۹۷ ۰۳:۲۲ ب.ظ
آخرین ارسال: fafaferdos

پرش به انجمن:

Can I see some ID?

به خاطر سپاری رمز Cancel

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. رمزت رو فراموش کردی؟ اینجا به یادت میاریم! close

رمزت رو فراموش کردی؟

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. close