סיבוכיות זמן
מתוך ויקיפדיה, האנציקלופדיה החופשית
בתורת החישוביות, סיבוכיות זמן של אלגוריתם היא הערכה, באמצעות חסמים, על מספר הפעולות שמבצע האלגוריתם במהלך פעולתו, כפונקציה של מורכבות הקלט.
היות שמספר הפעולות שמבצע אלגוריתם משתנה על פי רוב בהתאם לגודל הקלט שלו (דהיינו: אין לצפות שאלגוריתם למיון יסתיים לאחר אותו מספר צעדים כאשר הוא נדרש למיין 10 מספרים או 1000), מוגדרת מורכבות הקלט על פי רוב כגודל הקלט.
אין בוחנים את זמן הריצה ביחידות זמן (שניות, דקות וכו'), שכן משך הזמן לביצוע פעולות משתנה מסביבת ריצה אחת לשנייה. כמות ה"עבודה" הניתנת לביצוע בצעד בודד עשויה להיות שונה בין מודלים חישוביים שונים - ובוודאי בין מחשבים שונים. למשל, ייתכן שבמודל או בארכיטקטורה מסוימת ניתן לחלק שני מספרים בצעד אחד, ואילו במודל או ארכיטקטורה אחרת יידרשו לאותה פעולה מספר צעדים.
לכן, במדעי המחשב נוטים להתעלם מקבועים בעת התיחסות לסיבוכיות זמן ריצה של אלגוריתם, ולומר, למשל, כי הן אלגוריתם שדורש 8n צעדים על קלטים ממורכבות n, והן אלגוריתם שדורש 112n צעדים על קלטים כאלו הינם שניהם אלגוריתמים בעלי זמן ריצה לינארי.
הסימון הרווח לזמן הריצה של אלגוריתמים הינו:
![]() |
זמן ריצה פרופורציונלי, עד כדי קבוע, לפונקציה ![]() |
![]() |
זמן ריצה שאינו עולה על הפונקציה , עד כדי קבוע |
![]() |
זמן ריצה שאינו פוחת מהפונקציה , עד כדי קבוע |
תוכן עניינים |
[עריכה] סדרי גודל נפוצים
[עריכה] זמן ריצה לינארי
נאמר על אלגוריתם שזמן ריצתו לינארי אם זמן הריצה שלו חסום על ידי פונקציה לינארית בגודל הקלט, או - באופן שקול - פרופורציונלי לאורך הקלט.
לדוגמה, אלגוריתם אשר מחפש את המספר הגדול ביותר ברשימת מספרים נתונה על ידי מעבר סדרתי על הרשימה הינו הוא בעל זמן ריצה לינארי שכן אם גודל הקלט הוא n, האלגוריתם יבצע n צעדים.
מאידך, אלגוריתם מיון אשר ממיין רשימת מספרים על ידי בחירת המספר הגדול ביותר והסרתו מהרשימה, בחירת השני בגודלו והסרתו, וכן הלאה, אינו בעל זמן ריצה לינארי. זאת משום אם שגודל הקלט הוא n, האלגוריתם מבצע n שלבים, ובכל שלב מבצע בממוצע n/2 צעדים (מעבר על כל המספרים שנותרו) ולכן זמן הריצה יהיה ריבועי.
זמן ריצה לינארי הוא בפרט פולינומי ועל כן נחשב חישוב יעיל.
[עריכה] זמן ריצה פולינומי
לאלגוריתם נתון ישנו זמן ריצה פולינומי אם קיים פולינום
כך שזמן הריצה של האלגוריתם עבור קלטים בגודל n חסום על ידי ערך הפולינום עבור n. אלגוריתם אשר זמן ריצתם אינו חסום על ידי פולינום, כגון אלגוריתמים בעלי זמן ריצה מעריכי, נקראים לעתים "סופר-פולינומיים".
מקובל לקשר זמן ריצה פולינומי עם חישוב יעיל, כך שאלגוריתם ייחשב יעיל אם זמן הריצה שלו פולינומי. מעשית, לא כל זמן ריצה פולינומי מעיד על יעילות, שכן קיימים פולינומים בעלי חזקות גבוהות - בעת פיתוח אלגוריתם נעדיף זמן ריצה פולינומי מסדר נמוך, כגון זמן לינארי או ריבועי.
[עריכה] זמן ריצה מעריכי
סיבוכיות זמן הריצה של אלגוריתם היא מעריכית אם ורק אם פונקציית זמן הריצה שלו חסומה מלמעלה ומלמטה על ידי פונקציה מעריכית (kn) כפול קבוע, כאשר בסיס הפונקציה המעריכית (k) גדול מ-1.
עפ"י רוב, אלגוריתמים בעלי זמן ריצה מעריכי אינם נחשבים ליעילים, וזאת משום שהפונקציה המעריכית "גדלה מהר מאוד" ביחס לקלט; לכן, מועדף השימוש באלגוריתמים מזמני ריצה טובים יותר.
[עריכה] זמן ריצה תת-מעריכי
סיבוכיות זמן ריצה תת-מעריכית או תת-אקספוננציאלית, מוערכת על ידי
, כאשר:
הוא משקל החלק הלוגריתמי במעריך, בעוד שהמשלים ל-
הוא משקל החלק הלוג-לוגריתמי, הקטן יותר. לכל ערך של
, הפונקציה מייצגת סיבוכיות גדולה יותר ככל ש-
גדול יותר. לשם השוואה,
היא סיבוכיות אקספוננציאלית, בעוד ש-
היא סיבוכיות פולינומית. על סולם זה, קל להעריך את מידת היעילות של האלגוריתם מתוך התבוננות בערך
למשל
נמצאת ב"אמצע הדרך" בין סיבוכיות אקספוננציאלית לפולינומית.
בעיית פירוק לגורמים נחשבה במשך שנים לבעיה אקספוננציאלית והיא עמדה על סיבוכיות משוערת מסדר גודל
והושגו רק שיפורים מינוריים בערכו של הקבוע
. עד שנפרץ מחסום האקספוננציאליות ב-1988, כאשר המתמטיקאים ג'ון פולארד, מארק מאנאס, הנדריק לנסטרה וארג'ן לנסטרה פרסמו את שיטת נפת שדה מספרים המיוחדת לפירוק מספרים בעלי מבנה מיוחד כמספרי פרמה ומספרי קנינגהם. לשיטה זו סיבוכיות מהצורה
כשהקבוע
. כמספר שנים לאחר מכן, פותח האלגוריתם הכללי - "נפת שדה המספרים הכללית" המתאים לפירוק כל מספר שלם ויעילותו מוערכת ב-
, כשהקבוע
. בכל המקרים נוסחאות הסיבוכיות מנומקות, מוסכמות על כל המומחים, מגובות בתוצאות אמפיריות - אך אינן מוכחות.




![\ L_n[\alpha,c]=\mbox{exp}(c\log(n)^{\alpha}\log\log(n)^{1-\alpha})](http://upload.wikimedia.org/math/3/f/7/3f73e5e5013fa05d535fc7b40091bdc7.png)