עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

חישוב סיבוכיות זמן - למה אלו התשובות?

Featured Replies

פורסם

היי צהריים טובים.

אני לא מבין כל כך איך מחשבים את סיבוכיות הזמן בשני הקודים הבאים, אשמח אם תוכלו לעזור.

void f3(int n)
{
int i, m=1;
for(i = 0; i < n; i++)
m *= n;
while( m > 6)
m /= 3;
}

הסיבוכיות היא n*logn

int f4(int n)
{
int i, j, k=1, count;
for(i = 0; i < n; i++) {
k *= 3;
for(j = k; j; j /= 2)
count++;
}
return count;
}

הסיבוכיות היא n^2

תודה רבה מראש.

פורסם

ב-f3 יש שתי לולאות:

הלולאה הראשונה היא לולאה באורך n בדיוק, ולכן הסיבוכיות היא n. בסופה אתה נותר עם !m=n (כלומר n עצרת). מבחינת סדרי גודל של סיבוכיות, זה כמו n בחזקת n.

הלולאה השנייה תרוץ בערך (log3(m איטרציות, כלומר סיבוכיות של (log3(n^n שזה (nlog3(n, שזה כמובן nlogn.

השני דווקא יוצא לי גם כן nlogn ולא n^2...

פורסם
  • מחבר

תודה על התתייחסות.

מה שאני לא מבין זה מדוע בלולאה השניה זה log3(m)? האם ברגע שיש חלוקה זה סיבוכיות לוגריתמית?

התרגיל השני הוא n^2, בדקתי שוב פעם.

פורסם

בתרגיל הראשון M הוא לא N!, אלא באמת N^N, שכן מכפילים ב-N בכל פעם... N! ו-N^N היא ממש לא אותה סיבוכיות, ולהוכיח ש-logn! = o(logn^n) הוא תרגיל לא כל-כך טריוויאלי. ;)

מה שכן, זה באמת n*log_3(n)= nlogn.

למה? תחשוב שאתה מתחיל ממספר N ומחלק אותו ב-3 כל פעם? אחרי כמה צעדים תגיע ל-1? נכון, אחרי בערך log בבסיס 3 של N. כי תחשוב שהיית מתחיל מ-1 ומכפיל ב-3 כל פעם. אחרי X צעדים היית מגיע ל-3 בחזקת X. נסמן N = 3^X ונקבל שמספר הצעדים הוא log בבסיס 3 של N.

לגבי השאלה השניה: יש שם לולאה בתוך לולאה.

החיצונית רצה N פעמים.

הפנימית רצה logK פעמים (על-פי אותו טיעון כמו בשאלה 1).

בכל איטרציה של הלולאה הפנימית K=3^I.

לכן סה"כ זמן הריצה הוא

סכום (I מ-1 עד N) של log3^i , כלומר סכום (I מ-1 עד N) של O(i), כלומר N^2.

פורסם

צודקים, הייתה לי טעות, בשני המקרים לא שמתי לב במה כופלים :)

פורסם
  • מחבר

תודה רבה על העזרה לשניכם.

אני עדיין לא כל כך מבין את הקוד השני.

הלולאה הפנימית בקוד השני היא:

for(j = k; j; j /= 2)
count++;

מתי היא למעשה תעצור? הריי J אף פעם לא יהיה 0..

לא הבנתי גם איך עשית את השורה האחרונה בתשובתך.

פורסם

היא תעצור כי j הוא מטיפוס int, ולא double. חילוק ב-2 גם מעגל את התוצאה כלפי מטה.

פורסם
  • מחבר

thanks, you all helped me a lot.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.