שיעור קצב גדילת פונקציות אנחנו בודקים את היעילות האסימפטותית של האלגוריתם, כיצד גדל זמן הריצה כאשר גודל הקלט גדל ללא גבול. בדר"כ אלגוריתמים עם "סיבוכיות" ריצה טובה יותר יהיו יעילים יותר מלבד לקלטים קצרים ביותר. T() זמן הריצה הגרוע ביותר כאשר נתונה פונקציה סימון - Θ, אנחנו מגדירים קבוצה של פונקציות: T() = Θ( ) Θ ( g ( )) = f(): קיימים קבועים c ו- c וקיים 0 כך ש- :, 0 c g() f() c g() לכל 0 פונקציה f() שייכת לקבוצה Θ(g()) אם קיימים קבועים c ו- c כך שהיא בתוך סנדויץ בניהם ל- גדול מספיק. למרות ש- Θ(g()) הינה קבוצה, אנו כותבים Θ(g()) f() = לציין ש-( f( הינה בקבוצה. Θ(g()) f() Θ(g()) c g() f() c g() 0 f() = Θ(g()) - -
3 = Θ ( ) c -? c -? 0 -?. דוגמא: c c 3 c לכל, 0 3 c חילוק ב- : c, c 4 0 7 c = 4, c =, 0 = 7. דוגמא: 6 3 Θ( ) 6 3 Θ( ) c 6 0 האם קיים c לכל כך ש- ו-... c /6 ו- 0 גדול מ- זה לא יכול להיות קיים c 3. דוגמא: הנוסחה f() = a + b + c הינה ) Θ(, כיוון שחלק קטן מ- מספיק לפצות על. b + c a a + b + c a, 0 > (b + c) a = a + a a + a(b + c) = a + ab + ac - -
סימון - O O ( g( )) = f(): קיימים קבועים c ו- 0 כך ש- :, 0 f() cg() לכל 0 cg() f() f() = O(g()) O(g()) Θ(g()) נשים לב ש- a + b O( ) c = a + b, 0 = a + b a + b (לפעמים משתמשים בטעות ב- O() לסמן Θ()...) מיון הכנסה, sort : O( ) isertio מחיר הלולאה הפנימית הינו ()O i, ו- j הינם לכל היותר ולכן יש לנו זוגות של i ו-. j ) O( מתאים לכל ריצה של ה- isertio sort גם כזו שבה כל האיברים ממוינים ולוקחים Θ() זמן. - 3 -
סימון Ω Ω(g()) = f(): חסם תחתון אסימפטותי. קיימים קבועים c ו- 0 כך ש- :, 0 cg() f() לכל 0 f() cg() f() = Ω(g()) לכל ערך מימין ל- 0 הערך של f() הינו מעל cg(). לכל שתי פונקציות f() ו- g() f() = Θ(g()) : אם O(g()) f() = וגם Ω(g()). f() = Ω() לציון חסמים תחתונים, לדוגמא חייבים לפחות Ω() צעדים למיון, אחרת אי אפשר לקרוא את כל האיברים במערך. + 3 + = + Θ() בעצם: f() + וגם f() Θ() לדוגמא ב- Merge Sort נוכל לכתוב : Θ().T() = T(/) + - 4 -
השוואה בין פונקציות f() ו- g() הינם חיוביות בגלל : f() = Θ(g()) g() = Θ(h()) f() = Θ(h()) f() = O(g()) g() = O(h()) f() = O(h()) f() = Ω(g()) g() = Ω(h()) f() = Ω(h()) f() = Θ(f()) f() = O(f()) f() = Ω(f()) f() = Θ(g()) אם"ם g() = Θ(f()) f() = O(g()) אם"ם g() = Ω(f()) טרנזיטיביות: רפלקסיביות: סימטריות: הופכיות:...3.4 f() = O(g()) a b f() = Ω(g()) a b f() = Θ(g()) a = b f() = g() = +si() אבל נשים לב שלא חייב להיות יחס בין a ל- b, למשל: סימונים של פונקציות f(m) f() m מונוטונית עולה: f() f(m) f() m מונוטונית יורדת: f() f(m) < f() m < עולה ממש: f() f(m) > f() m < יורדת ממש: f() א. ב. ג. ד. - 5 -
x < x x x < x + + = b = a / ab. סימון ריצפה ותקרה: p( ) = d i= 0 a i. פולינומים: a 0 = a = a a - = /a (a m ) = a m (a m ) = (a ) m a m a = a m + 3. אקספוננטים: lg = log a = b log b a log c (ab) = log c a + log c b log b a = log b a 4. לוגריתמים:! = ( ) if if = 0 > 0 עצרת: הערכה לפי מספר סטרלינג:.5! = π + Θ e - 6 -
:log *.6 lg ( i) ( i ) = lg( lg ) רדגומ if i > 0 ad if i > 0 ad אל if i = 0 [ i] { i > 0 lg } lg * = mi lg lg ( i ) ( i ) > 0 0 or lg ( i ) רדגומ אל lg * = lg * 4 = lg * 6 = 3 lg * 65536 = 4 lg * 65536 = 5 0 80 F 0 = 0 F = F i = F i- + F i-, i 7. מספרי פיבונאצ'י: 0,,,, 3, 5, 8, 3, חיפוש בינארי עלינו למצוא מספר a בתחום [...] ע"י שאלות מהסוג :האם a גדול\קטן\שווה. חיפוש בספר טלפון: מציאת איבר בסדרה ממוינת של מספרים.? = בסיבוב ראשון נשאל האם גדול k כן לא a.. a +.. וכו'. - 7 -
, בכל סיבוב אנו מקטנים את האינטרוול בו ידוע ש- a נמצא בחצי. לאחר k סיבובים גודל האינטרוול יהיה אחד והוא יכיל את. a מספר החיפושים הוא אם כן : ולכן זמן החיפוש הבינארי הוא : k = log log = O(log ) לאחר השאלה ה- ית גודל האינטרוול בו נמצא המספר המבוקש הוא כאשר.log() = log( i ) = i = i חידה: מנחשים מספר בין ל-. k וצריך למצוא אותו במספר מינימלי של מחזורים. בכל מחזור ניצן לשאול לכל היותר k שאלות (k לא ידוע) מהסוג האם קטן מ- k. והתשובה מקבילית. בשני מחזורים לכל היותר. ואח"כ שאל לכל אחר. רעיון ראשון חלוקה ל- שאלה אם קטן מ- - 8 -