توی این ضمیمه شما خانم zr2358 که نوشته
T(n)=T(n−1)c
خوب این مرتبش
O(n) هست و درسته.
ولی دومی
T(n)=T(n−1)T(n−1)c=2T(n−1)c
که از مرتبه
O(2n) هست.
دلیلش اینه که در اولی ما فقط یک تابع رو داریم فراخوانی میکنیم(به خاطر همین ضریب T(n-1 یک است )پس بیشتر از n تا فراخوانی نداریم. c=2 است چون در هر فراخوانی یک ضرب و یک جمع نیز داریم.
ببینید این ۲ که در خود تابع داره ضرب میشه نباید شما رو گمراه کنه این ۲ صرفا یک عدد است که دارد ضرب میشود و مرتبه را فقط یک واحد افزایش میدهد یعنی اگر این ۲ ،۱۰۰۰ هم بود فرقی نداشت.
اما در حالت دوم داریم هر به ازای هر n
دو بار تابع فراخوانی میکنیم و این خیلی بده یعنی ۲*۲*۲*..... بار فراخوانی داریم .(شبیه فیبوناچی) خیلیها رو داریم تکراری حساب میکنیم و به خاطر همین مرتبه بالا رفته. c=2 است چون در هر بار فراخوانی دو جمع داریم.
توی کتاب مقسمی متاسفانه اشتباه کرده !
(۱۴ بهمن ۱۳۸۹ ۰۱:۱۱ ب.ظ)zr2358 نوشته شده توسط: ممنونم
راستش خیلی متوجه حرفاتون نشدم
این تاپیک خیلی اعتماد به نفسم رو پایین آورد!
سوالی که توی پست اول همین تاپیک پرسیده شد و جواب دادید هر دو یکسانه بچهها گفتند مقسمی با تابع اشتباه گرفته
یعنی اگه تابع بود فرق می کرد مرتبه شون؟
اگر تابع بود آن ۲ که داشت در تابع ضرب میشد صرفا یک عدد بود که اگر ۱۰۰۰ هم بود تفاوتی نداشت.
اما وقتی دو زیرروال را داریم جمع میزنیم (مثل فیبوناچی )یعنی برای هر کدام باید مقادیر تکراری زیادی حساب کنیم و همانطور که در بالا توضیح دادم مرتبه خیلی بالا میره.
اگه میخواید فرق تابع و رابطه رو بهتر متوجه بشید بهتره اون شبه کدهایی که ضمیمه کردین رو به ازای n=4 یکبار trace کنید(و تعداد + و * رو بدست بیارید) بعد رابطشون رو به ازای n=4 چک کنید. و متوجع تفاوتشون میشید.