פירוש נוסף ערך זה עוסק בקושי בחישוב. אם התכוונתם לתופעה רפואית, ראו סיבוך.
מחלקות סיבוכיות
במדעי המחשב, **סיבוכיות** (באנגלית: complexity) היא כלי מדד מתמטי של משאבי המערכת הנחוצים לפתרון בעיה נתונה באמצעות מחשב. המשאב העיקרי הנבחן הוא **זמן הריצה**, כלומר נבחן משך הזמן הנחוץ לשם ביצוע האלגוריתם. משאב נוסף הוא ה**זיכרון** הנחוץ לשם ביצוע האלגוריתם. ניתן להביא בחשבון משאבים נוספים, כגון כמה מעבדים נחוצים לשם פתרון הבעיה בעיבוד מקבילי. התורה החוקרת סיבוכיות קרויה תורת הסיבוכיות. ענף הסיבוכיות נבדל מענף החישוביות, שבו נבחנת השאלה האם ניתן בכלל לפתור בעיה נתונה, בלא קשר לכמות המשאבים הנחוצה.

מאפייני הסיבוכיות
-----------------

**בעיה**, בהקשר זה, היא קבוצה של שאלות בעלות קשר הדוק. דוגמה: בעיית הפירוק לגורמים היא: כאשר נתון מספר שלם כלשהו, הצג את כל הגורמים הראשוניים שלו. שאלה ספציפית קרויה **מופע** של הבעיה. דוגמה: השאלה "הצג את הגורמים של המספר 15" היא מופע של בעיית הפירוק לגורמים.

**סיבוכיות הזמן** של בעיה נתונה היא מספר הצעדים הנחוצים לפתרון מופע שלה כפונקציה של גודל הקלט של מופע זה, תוך שימוש באלגוריתם היעיל ביותר למטרה זו. אם לפתרונו של מופע שאורך הקלט שלו הוא {\displaystyle n} סיביות נחוצים {\displaystyle n^{2}} צעדים, סיבוכיות הזמן שלו היא {\displaystyle n^{2}}. מספר הצעדים המדויק תלוי במחשב המסוים שישמש לפתרון הבעיה. כדי להימנע מהתייחסות למחשב מסוים נהוג להשתמש במודל מתמטי עבור מחשב: מכונת טיורינג. בנוסף, כדי להימנע מחישובים טכניים מדי ומכיוון שעיקר העניין הוא הקצב שבו כמות המשאבים הנדרשים גדלה ככל שהקלט לבעיה גדל, נהוג לסמן את סיבוכיות הזמן באמצעות סימון אסימפטוטי שמייצג **סדר גודל** של זמן הריצה, ולמדוד את זמן הריצה על פי מספר הביצועים של פעולות בסיסיות (כמו ביצוע פעולה אריתמטית, קריאת ערך של תא בזיכרון וכדומה). בצורה זו סיבוכיות הזמן מייצגת את הזמן הנחוץ לפתרונה בכל מחשב מסוים (עד כדי הכפלה או הוספה של קבוע שתלוי ברמת הביצועים של המחשב המסוים הזה), כך שהסיבוכיות המוצגת אינה תלויה במחשב שישמש לפתרון הבעיה ואינה מציגה את הזמן הדרוש לפתרון הבעיה בשניות, אלא מייצגת את סדר הגודל של הזמן הנחוץ לפתרון הבעיה כפונקציה של אורך הקלט.

דוגמה: לכיסוח דשא יש סיבוכיות ליניארית, משום שהכפלת שטח הדשא מכפילה את הזמן הנחוץ להשלמת המשימה. לחיפוש במילון, לעומת זאת, יש סיבוכיות לוגריתמית בבסיס 2: בהנחה שהמחפש מחפש במילון בחיפוש בינארי, הכפלת גודל המילון תוסיף רק צעד אחד - פתיחת המילון באמצעו - למספר הצעדים הנחוץ לביצוע החיפוש, משום שצעד זה מקטין לחצי את גודל הבעיה.

דוגמה זו ממחישה שלבעיות שונות עשויה להיות רמת סיבוכיות שונה. הטבלה הבאה מציגה רמות אחדות של סיבוכיות בסדר יעילות יורד ({\displaystyle n} הוא גודל הקלט, {\displaystyle c} הוא קבוע גדול מ-1):

| שם | סימון |
| --- | --- |
| קבוע | {\displaystyle O(1)} |
| לוגריתמי | {\displaystyle O(log(n))} |
| פולילוגריתמי | {\displaystyle O(log^{c}(n))} |
| ליניארי | {\displaystyle O(n)} |
| פולינומי | {\displaystyle O(n^{c})} |
| מעריכי | {\displaystyle O(c^{n})} |
| עצרתי | {\displaystyle O(n!)} |

כאשר רמת הסיבוכיות של בעיה היא פולינומית (או פחות מזה) הבעיה נחשבת כבעלת פתרון "יעיל", משום שהגדלת אורך הקלט אינה מביאה לשינוי דרמטי בזמן הנחוץ לפתרון הבעיה. לעומת זאת, כאשר לבעיה סיבוכיות מעריכית (אקספוננציאלית), שינוי קטן באורך הקלט מביא לשינוי מהותי בזמן הנחוץ לפתרון הבעיה. לדוגמה, כאשר הזמן הנחוץ לפתרונה של בעיה הוא {\displaystyle O(2^{n})} (סיבוכיות מעריכית) הגדלת אורך הקלט ב-1 מביאה להכפלת הזמן הנחוץ לפתרון הבעיה.

סוגים שונים של סיבוכיות
-----------------------

בנוסף לסיבוכיות זמן וסיבוכיות מקום שהוזכרו קודם, ישנם סוגים נוספים של מדדי סיבוכיות המשמשים בעיקר להבטחת איכות תוכנה. הבולט שבהם הוא סיבוכיות קוד. **סיבוכיות קוד** הוא מדד המאפיין את המורכבות של קוד תוכנה, ולמימושים שונים של אותו אלגוריתם יכולים להיות ערכי סיבוכיות קוד שונים, למרות שסיבוכיות המקום והזמן תישאר זהה.

סוג נוסף של מדד סיבוכיות הוא סיבוכיות תקשורת המודדת את כמות המידע העוברת בין שני צדדים המשתתפים בפתרון בעיה.

יישומים לבעיות עם סיבוכיות גבוהה
--------------------------------

ידועות כיום מספר בעיות שלא מוכר אלגוריתם יעיל הפותר אותן, אך בהינתן מידע נוסף הן ניתנות לפתרון יעיל, מה שפותח פתח לשימוש בבעיות אלו כבסיס למערכות הצפנה. הדוגמה הקלאסית היא של מערכת ההצפנה RSA, שבה כדי לפענח הודעה יש לבצע חישוב התלוי במספר שהוא מכפלת שני ראשוניים גדולים. אם שני הראשוניים הללו ידועים קל לבצע את החישוב שמפענח הודעה; אך לא ידועה שום דרך לבצע חישוב זה ביעילות אם הם אינם ידועים, כך שקשה לתוקף לפצח את ההודעה (המתקפה הישירה ביותר דורשת לפרק לגורמים את המכפלה, אך גם זוהי בעיה שנחשבת כיום לקשה). באופן כללי פונקציות שקל לחשב אך קשה להפוך מבלי שיהיה נתון מידע נוסף נקראות "פונקציות מלכודת" (Trapdoor functions).

ראו גם
------

|  |
| --- |
| 
**עיינו גם בפורטל**

**פורטל מדעי המחשב** הוא שער לכל הנושאים הקשורים במדעי המחשב. ניתן למצוא בו קישורים אל תחומי המשנה של הענף, מושגי יסוד בתחום, מדענים חשובים ועוד.
 |

* מונחים בתוכנה

קישורים חיצוניים
----------------

| מיזמי קרן ויקימדיה |
| --- |
| ויקימילון ערך מילוני בוויקימילון: **סבוכיות** |

* Complexity Zoo - אינדקס מקיף של מחלקות סיבוכיות
* מורכבות (פילוסופיה), דף שער בספרייה הלאומית

| תחומים במדעי המחשב |
| --- |
| יסודות מתמטים | לוגיקה מתמטית • תורת הקבוצות • תורת המספרים • תורת הגרפים • תורת הטיפוסים • תורת הקטגוריות • אנליזה נומרית • תורת האינפורמציה |
| תורת החישוביות | תורת האוטומטים • תורת הרקורסיה • תורת הסיבוכיות • מחשוב קוונטי |
| אלגוריתמים ומבנה נתונים | אנליזה של אלגוריתמים • גאומטריה חישובית |
| שפות תכנות ומהדרים | מפרש • פרדיגמת תכנות (תכנות פרוצדורלי • תכנות מונחה עצמים • תכנות פונקציונלי • תכנות לוגי) |
| חישוב מבוזר ועיבוד מקבילי | עיבוד מקבילי • מחשוב סריגי • בקרת מקביליות |
| הנדסת תוכנה | ניתוח מערכות מידע • עיצוב תוכנה • תכנות מחשבים • שיטות פורמליות • בדיקות תוכנה • מתודולוגיית פיתוח תוכנה |
| תקשורת | ניתוב • טופולוגיית רשת • קריפטוגרפיה |
| מסד נתונים | מסד נתונים יחסי • SQL • תנועה • אינדקסים • כריית מידע • CAP theorem |
| בינה מלאכותית | חשיבה אוטומטית • בלשנות חישובית • ראייה ממוחשבת • עיבוד שפה טבעית • בינה חישובית • מערכת מומחה • למידה חישובית • רובוטיקה |
| גרפיקה | הדמיה ממוחשבת • הנפשה ממוחשבת • עיבוד תמונה |
| שפות פורמליות | שפה רגולרית • שפה חסרת הקשר • שפה תלוית הקשר • ההיררכיה של חומסקי |
| שימושים במדע | ביואינפורמטיקה • מדעים קוגניטיביים • כימיה חישובית • פיזיקה חישובית • אנליזה נומרית |