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





