قبلا به جای تقسیم گذاشته بودید * و من نوشتم دیدم حلقه ی بی نهایت میشه و جواب نداره.
الان که تبدیل به تقسیم کردید دوباره حل کردم.
اول : i=n
تا زمانی که i از ۱ بزرگتر هست، دستورات داخل while اول اجرا میشه.
……………….j=1
……………...تا زمانی که j از n کوچک تر هست، دستورات داخلی while دوم اجرا میشه.
……………………………. j=j*3
………………..……………i=i/2
………………..……………*write
j=1 هر بار در ۳ ضرب میشه تا برسه به n که از شرط while دوم بیرون بیایم. log3n بار j در سه ضرب میشه تا برسه به n. دستور چاپ * هم به تعداد log3n بار اجرا میشه.
وقتی j به n رسید i چند شده؟ i که قبل از این while دوم n بود الان هر بار با ضربدر ۳ شدن j, تقسیم بر ۲ شده. یعنیlog3n بار بر ۲ تقسیم شده.
یعنی برای while داخلی:
j=3 ….. i=n/2
j=32........i=n22
j=33........i=n23
j=34........i=n24
.
.
.j=3k........i=n2k
تا جایی این ضرب در ۳ برای j ادامه داره که به n برسه. یعنی :
3k<=n
k=log3n
پس در انتهای حلقه ی while، مقدار i هم شده n2k=n(2log3n)=nnlog32=nn1−t
در این جا log3n بار عمل چاپ * انجام شده.
حالا از while دوم مییایم بیرون. شرط while اول برقرار هست، چون i از ۱ بزرگتر هست و دوباره j=1 میشه و به همون ترتیب بالا.
نکته ای که وجود داره این هست که چند بار حلقه ی while دوم انجام میشه؟ و در واقع i تا کی از ۱ بزرگتر خواهد موند؟
واضح هست که زمانی شرط حلقه ی اول نقض میشه که i=1 بشه یا مقداری کمتر از ۱.
الان بعد از یک بار اجرای حلقه ی دوم که مقدار i بزرگتر از یک هست دوباره شرط while اول درست هست و میایم داخل حلقه.
j=1
j=3......i=nnlog32⋅2 که i مقدارش از ۱ کمتر میشه. اما این شرط حلقه رو که j<n رو نقض نمیکنه. پس این while دوم هم log3n بار اجرا میشه تا از while دوم بیاد بیرون. در این جا مقدار i برابر شده با nn2log32
حالا شرط while اول چک میشه. غلط هست چون i از ۱ کوچیکتر هست. پس کلا دو تا log3n بار دستورات انجام شد و در نتیجه مرتبه ی زمانی برابر میشه با θ(log3n)