تالار گفتمان مانشت
پیچیدگی زمانی یک قطعه کد نسبتا جالب! - نسخه‌ی قابل چاپ

پیچیدگی زمانی یک قطعه کد نسبتا جالب! - arshad90 - 13 آذر ۱۳۸۹ ۱۲:۰۰ ب.ظ

قطعه کد زیر رو در نظر بگیرید. لطفا بگید به نظر شما رابطه بازگشتی برای این قطعه کد چیه؟ و پیچیدگی زمانیش از چه مرتبه ایه.

به نظر میاد این قطعه کد از مرتبه O(logn) باشه. من درختش رو رسم کردم در واقع چون هر ۴ فراخوانی مثل همن فقط یه فراخوانی از مرتبه M(n-3) است و بقیه از مرتبه O(1) هست. به نظرتون این تحلیل درسته؟

پیچیدگی زمانی یک قطعه کد نسبتا جالب! - ف.ش - ۱۳ آذر ۱۳۸۹ ۰۲:۳۴ ب.ظ

خیر درست نیست.اگه آرایه داشتیم حرف شما درست بود یکی رو حساب میکردیم و واسه بقیه دیگه نیازی نبود.

اما توی روابط بازگشتی ما از بقیه شاخه ها(سایر فراخوانی ها) خبر نداریم!

اگه واسه اعداد کوچکتر از ۱۰ یه عدد return میکردیم اونوقت T اینجوری میشد:

T(n)=4*T(n-3) ,T(10)=1

که اگه بسط بدین میشه [tex]O(4^{\left\lceil(n-10)/3\right\rceil})[/tex]


اما الان که داره واسه کوچکتر از ۱۰ هم باز بازگشتی کار میکنه و شرط توقفی نداریم هیچ وقت این الگوریتم پایان نمی پذیره!
در ضمن logn واسه وقتی است که n داره بر یه چیزی تقسیم میشه نه منها!

هر موقع - دیدین یاد فیبوناچی بیفتین که نمایی میشه البته وقتی نمایی میشه که bT(n-a داشته باشیم و میشه b^n/a

پیچیدگی زمانی یک قطعه کد نسبتا جالب! - sal_dovomi - 13 آذر ۱۳۸۹ ۰۲:۵۳ ب.ظ

معادله یچیدگی زمانی این میشه:
T(n)=4(n-3)+4
که با حل آن یک معادله درجه ۳ به دست میاد و ما از حل آن عاجزیم.
ولی با همان حل دست و پا شکسته فکر میکنم بشه O(4^n/3)=time

RE: پیچیدگی زمانی یک قطعه کد نسبتا جالب! - Masoud05 - 13 آذر ۱۳۸۹ ۰۹:۵۹ ب.ظ

به نظر من:

[تصویر:  attachment.php?aid=134]

طبق نکته:

[تصویر:  attachment.php?aid=135]

RE: پیچیدگی زمانی یک قطعه کد نسبتا جالب! - arshad90 - 13 آذر ۱۳۸۹ ۱۰:۵۳ ب.ظ

(۱۳ آذر ۱۳۸۹ ۰۲:۳۴ ب.ظ)afagh1389 نوشته شده توسط:  خیر درست نیست.اگه آرایه داشتیم حرف شما درست بود یکی رو حساب میکردیم و واسه بقیه دیگه نیازی نبود.

اما توی روابط بازگشتی ما از بقیه شاخه ها(سایر فراخوانی ها) خبر نداریم!

اگه واسه اعداد کوچکتر از ۱۰ یه عدد return میکردیم اونوقت T اینجوری میشد:

T(n)=4*T(n-3) ,T(10)=1

که اگه بسط بدین میشه [tex]O(4^{\left\lceil(n-10)/3\right\rceil})[/tex]


اما الان که داره واسه کوچکتر از ۱۰ هم باز بازگشتی کار میکنه و شرط توقفی نداریم هیچ وقت این الگوریتم پایان نمی پذیره!
در ضمن logn واسه وقتی است که n داره بر یه چیزی تقسیم میشه نه منها!

هر موقع - دیدین یاد فیبوناچی بیفتین که نمایی میشه البته وقتی نمایی میشه که bT(n-a داشته باشیم و میشه b^n/a


حق با آفاق هست، دوستان عزیز sal-dovomi و Masoud به این نکته تو شرط بازگشت توجه نکردن. توی شرط بازگشت وقتی می گیم: if (n<=10) then return M(30)، باز هم داریم فراخوانی بازگشتی رو انجام می دیم. اگر عددی رو برمیگردوند می شد نظر شما رو در نظر گرفت. اما نمیشه چون باز هم در شرط بازگشت فراخوانی بازگشتی داریم.
حالا سوال اصلی اینجاست، با وجود اینکه این قطعه کد پایان ناپذیره، آیا نمیشه حدی برای پیچیدیگی زمانیش در نظر گرفت؟ اگر میشه این حد چیه؟Exclamation

RE: پیچیدگی زمانی یک قطعه کد نسبتا جالب! - Masoud05 - 14 آذر ۱۳۸۹ ۱۱:۱۵ ب.ظ

(۱۳ آذر ۱۳۸۹ ۱۰:۵۳ ب.ظ)arshad90 نوشته شده توسط:  حق با آفاق هست، دوستان عزیز sal-dovomi و Masoud به این نکته تو شرط بازگشت توجه نکردن. توی شرط بازگشت وقتی می گیم: if (n<=10) then return M(30)، باز هم داریم فراخوانی بازگشتی رو انجام می دیم. اگر عددی رو برمیگردوند می شد نظر شما رو در نظر گرفت. اما نمیشه چون باز هم در شرط بازگشت فراخوانی بازگشتی داریم.
حالا سوال اصلی اینجاست، با وجود اینکه این قطعه کد پایان ناپذیره، آیا نمیشه حدی برای پیچیدیگی زمانیش در نظر گرفت؟ اگر میشه این حد چیه؟Exclamation

با سلام، حرف شما و آفاق درسته اما من حدث می زنم که شاید منظور برگرداندن یه مقداره (شرط مرزی) و نه فرخوانی دوباره تابع برای مقدار ۳۰
حالا بازم اگه دارم اشتباه مکنم لطف کنید‌، بهم بگین.Shy

پیچیدگی زمانی یک قطعه کد نسبتا جالب! - ف.ش - ۱۵ آذر ۱۳۸۹ ۱۲:۳۲ ق.ظ

امکانش هست که اشتباه تایپی باشه! ولی چیزی که اینجا نوشته با return یه مقدار غیر بازگشتی فرق داره!!!

پیچیدگی زمانی یک قطعه کد نسبتا جالب! - ف.ش - ۲۰ آذر ۱۳۸۹ ۰۹:۱۴ ق.ظ

این الگوریتم پیچیدگیش بینهایت هست چون هیچوقت تموم نمیشه اگه سوال تستی دادن باید بیشترین مرتبه زمانی بین گزینه‌ها رو واسش انتخاب کنید.