تالار گفتمان مانشت
نحوه محاسبه مرتبه زمانی - نسخه‌ی قابل چاپ

نحوه محاسبه مرتبه زمانی - Majiid - 27 مهر ۱۳۹۵ ۱۰:۵۵ ق.ظ

سلام دوستان.
خسته نباشید.
میشه نحوه محاسبه مرتبه زمانی این شبه کد رو مرحله به مرحله توضیح بدین؟
[attachment=20689]
سپاسگذارم.

RE: نحوه محاسبه مرتبه زمانی - Behnam‌ - ۲۷ مهر ۱۳۹۵ ۰۱:۳۰ ب.ظ

[attachment=20692]

RE: نحوه محاسبه مرتبه زمانی - Pure Liveliness - 27 مهر ۱۳۹۵ ۰۱:۳۰ ب.ظ

قبلا به جای تقسیم گذاشته بودید * و من نوشتم دیدم حلقه ی بی نهایت میشه و جواب نداره.
الان که تبدیل به تقسیم کردید دوباره حل کردم.
اول : i=n
تا زمانی که i از ۱ بزرگتر هست، دستورات داخل while اول اجرا میشه.
……………….j=1
……………...تا زمانی که j از n کوچک تر هست، دستورات داخلی while دوم اجرا میشه.
……………………………. j=j*3
………………..……………i=i/2
………………..……………*write
j=1 هر بار در ۳ ضرب میشه تا برسه به n که از شرط while دوم بیرون بیایم. [tex]\log_3n[/tex] بار j در سه ضرب میشه تا برسه به n. دستور چاپ * هم به تعداد [tex]\log_3n[/tex] بار اجرا میشه.
وقتی j به n رسید i چند شده؟ i که قبل از این while دوم n بود الان هر بار با ضربدر ۳ شدن j, تقسیم بر ۲ شده. یعنی[tex]\log_3n[/tex] بار بر ۲ تقسیم شده.
یعنی برای while داخلی:
j=3 ….. i=n/2
[tex]j=3^{2\: }........i=\frac{n}{2^2}[/tex]
[tex]j=3^{3\: }........i=\frac{n}{2^3}[/tex]
[tex]j=3^{4\: }........i=\frac{n}{2^4}[/tex]
.
.
.[tex]j=3^k\: ........i=\frac{n}{2^k}[/tex]
تا جایی این ضرب در ۳ برای j ادامه داره که به n برسه. یعنی :
[tex]3^k<=n[/tex]
[tex]k=\log_3n[/tex]
پس در انتهای حلقه ی while، مقدار i هم شده [tex]\frac{n}{2^k}=\frac{n}{(2^{\log_3n})}=\frac{n}{n^{\log_32}}=\frac{n}{n^{1-t}}[/tex]
در این جا [tex]\log_3n[/tex] بار عمل چاپ * انجام شده.
حالا از while دوم مییایم بیرون. شرط while اول برقرار هست، چون i از ۱ بزرگتر هست و دوباره j=1 میشه و به همون ترتیب بالا.
نکته ای که وجود داره این هست که چند بار حلقه ی while دوم انجام میشه؟ و در واقع i تا کی از ۱ بزرگتر خواهد موند؟
واضح هست که زمانی شرط حلقه ی اول نقض میشه که i=1 بشه یا مقداری کمتر از ۱.
الان بعد از یک بار اجرای حلقه ی دوم که مقدار i بزرگتر از یک هست دوباره شرط while اول درست هست و میایم داخل حلقه.
j=1
[tex]j=3\: ......\: i=\frac{n}{n^{\log_32}\cdot2}[/tex] که i مقدارش از ۱ کمتر میشه. اما این شرط حلقه رو که [tex]j<n[/tex] رو نقض نمیکنه. پس این while دوم هم [tex]\log_3n[/tex] بار اجرا میشه تا از while دوم بیاد بیرون. در این جا مقدار i برابر شده با [tex]\frac{n}{n^{2\log_32}}[/tex]
حالا شرط while اول چک میشه. غلط هست چون i از ۱ کوچیکتر هست. پس کلا دو تا [tex]\log_3n[/tex] بار دستورات انجام شد و در نتیجه مرتبه ی زمانی برابر میشه با [tex]\theta(\log_3n)[/tex]