סיבוכיות – הבדלי גרסאות

נוספו 113 בתים ,  לפני שנתיים
מ
הגהה, עריכת נוסחאות
מ (בוט החלפות: \1ליניארי)
מ (הגהה, עריכת נוסחאות)
'''בעיה''', בהקשר זה, היא [[קבוצה (מתמטיקה)|קבוצה]] של שאלות בעלות קשר הדוק. דוגמה: בעיית ה[[פירוק לגורמים של מספר שלם|פירוק לגורמים]] היא: כאשר נתון מספר שלם כלשהו, הצג את כל ה[[גורם ראשוני|גורמים הראשוניים]] שלו. שאלה ספציפית קרויה '''מופע''' של הבעיה. דוגמה: השאלה "הצג את הגורמים של המספר 15" היא מופע של בעיית הפירוק לגורמים.
 
'''סיבוכיות הזמן''' של בעיה נתונה היא מספר הצעדים הנחוצים לפתרון מופע שלה כפונקציה של גודל הקלט של מופע זה, תוך שימוש באלגוריתם היעיל ביותר למטרה זו. אם לפתרונו של מופע שאורך הקלט שלו הוא <math> n</math> [[סיבית|סיביות]] נחוצים n<supmath> n^2</supmath> צעדים, סיבוכיות הזמן שלו היא n<supmath> n^2</supmath>. מספר הצעדים המדויק תלוי במחשב המסוים שישמש לפתרון הבעיה. כדי להימנע מהתייחסות למחשב מסוים נהוג להשתמש במודל מתמטי עבור מחשב: [[מכונת טיורינג]]. בנוסף, כדי להימנע מחישובים טכניים מדי ומכיוון שעיקר העניין הוא הקצב שבו כמות המשאבים הנדרשים גדלה ככל שהקלט לבעיה גדל, נהוג לסמן את סיבוכיות הזמן באמצעות [[סימון אסימפטוטי]] שמייצג '''סדר גודל''' של זמן הריצה, ולמדוד את זמן הריצה על פי מספר הביצועים של פעולות בסיסיות (כמו ביצוע פעולה אריתמטית, קריאת ערך של תא בזיכרון וכדומה). בצורה זו סיבוכיות הזמן מייצגת את הזמן הנחוץ לפתרונה בכל מחשב מסוים (עד כדי הכפלה או הוספה של קבוע שתלוי ברמת הביצועים של המחשב המסוים הזה), כך שהסיבוכיות המוצגת אינה תלויה במחשב שישמש לפתרון הבעיה ואינה מציגה את הזמן הדרוש לפתרון הבעיה ב[[שנייה|שניות]], אלא מייצגת את סדר הגודל של הזמן הנחוץ לפתרון הבעיה כפונקציה של אורך הקלט.
 
דוגמה: לכיסוח דשא יש סיבוכיות ליניארית, משום שהכפלת שטח הדשא מכפילה את הזמן הנחוץ להשלמת המשימה. לחיפוש במילון, לעומת זאת, יש סיבוכיות [[לוגריתם|לוגריתמית]] בבסיס 2: בהנחה שהמחפש מחפש במילון ב[[חיפוש בינארי]], הכפלת גודל המילון תוסיף רק צעד אחד - פתיחת המילון באמצעו - למספר הצעדים הנחוץ לביצוע החיפוש, משום שצעד זה מקטין לחצי את גודל הבעיה.
 
דוגמה זו ממחישה שלבעיות שונות עשויה להיות רמת סיבוכיות שונה. הטבלה הבאה מציגה רמות אחדות של סיבוכיות בסדר יעילות יורד (<math> n</math> הוא גודל הקלט, <math> c</math> הוא קבוע גדול מ-1):
 
{| class="wikitable"
|-
|קבוע
|style="direction: ltr;"|<math> O(1)</math>
|-
|לוגריתמי
|style="direction: ltr;"|<math> O(log(n))</math>
|-
| פולילוגריתמי
|style="direction: ltr;"|<math> O(log<sup>^c</sup>(n))</math>
|-
|ליניארי
|style="direction: ltr;"|<math> O(n)</math>
|-
|פולינומי
|style="direction: ltr;"|<math> O(n<sup>^c)</supmath>)
|-
|מעריכי
|style="direction: ltr;"|<math> O(c<sup>^n)</supmath>)
|-
|עצרתי
|style="direction: ltr;"|<math> O(n!)</math>
|}
 
כאשר רמת הסיבוכיות של בעיה היא [[פולינום|פולינומית]] (או פחות מזה) הבעיה נחשבת כבעלת פתרון "[[חישוב יעיל|יעיל]]", משום שהגדלת אורך הקלט אינה מביאה לשינוי דרמטי בזמן הנחוץ לפתרון הבעיה. לעומת זאת, כאשר לבעיה סיבוכיות [[פונקציה מעריכית|מעריכית]] (אקספוננציאלית), שינוי קטן באורך הקלט מביא לשינוי מהותי בזמן הנחוץ לפתרון הבעיה. לדוגמה, כאשר הזמן הנחוץ לפתרונה של בעיה הוא <math>\ O(2^n)</math> (סיבוכיות מעריכית) הגדלת אורך הקלט ב-1 מביאה להכפלת הזמן הנחוץ לפתרון הבעיה.
 
==סוגים שונים של סיבוכיות==