סימון אסימפטוטי

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

==הגדרה פורמלית==
השימוש בסימון אסימפטוטי מערב תמיד פונקציה <math>\ g</math>, על פי רוב מקבוצת הטבעיים לעצמה או הממשיים לעצמה. הפונקציה <math>\ g</math> משמשת בתור קנה המידה ההשוואתי לפונקציות אחרות. לרוב ההתעניינות היא בקצב הגדילה של <math>\ g</math> כאשר הערכים שהיא מקבלת שואפים לאינסוף, אולם הדבר אינו הכרחי. בהגדרות שנביא כאן נניח כי כל הפונקציות הן מהטבעיים לעצמם (מצב נפוץ במיוחד במדעי המחשב, מכיוון שמדדי סיבוכיות זמן וזיכרון הם חיוביים ובדידים). עם זאת, גם ללא ההנחה נדרוש מ-g להיות אי שלילית החל מאיבר מסוים.

===הסימון O===
דוגמה לסימון O גדול: <math>f(x) \in O(g(x))</math> כי קיים <math>c>0</math> (ובפרט <math>c=1</math>) ו-<math>x_0</math> (ובפרט <math>x_0 = 5</math>) עבורם <math>\ f(n)\le \;c\cdot g(n)</math> לכל <math> x \geq x_0</math>.

הסימון הנפוץ ביותר הוא הסימון "O" (קרי: אוֹוּ גדול). כאשר עוסקים בשאיפה של <math>\ g(n)</math> לאינסוף, מוגדרת הקבוצה <math>\ O(g(n))</math> בתור אוסף כל הפונקציות <math>\ f(n)</math> (בעלות אותו תחום וטווח כמו <math>\ g</math>) עבורן קיימים קבועים חיוביים <math>\ n_0 \in \mathbb{N},0<c \in \mathbb{R}</math> כך שלכל <math>\ n>n_0</math> מתקיים <math>\ f(n)\le \;c\cdot g(n)</math>. כלומר: עבור ערכי n הולכים וגדלים שמקבלת <math>\ f</math>, היא קטנה יותר מ-<math>\ g</math> עד כדי כפל בקבוע.

בסימון מתמטי המשתמש בגבולות, ניתן להגדיר כי פונקציה <math>\ f(n)</math> שייכת ל-<math>\ O(g(n))</math> אם <math>\ \limsup_{n\to\infty}\frac{f(n)}{g(n)}<\infty</math>. שתי ההגדרות שקולות.

מטעמי פשטות, נהוג לכתוב <math>\ f(n)=O(g(n))</math> כאשר הכוונה היא שמתקיים <math>\ f(n)\isin O(g(n))</math>. ביטוי זה עשוי לגרום לבלבול אם מתייחסים אליו כמציין שוויון ולא שייכות; בפרט, הוא אינו סימטרי. למשל, מתקיים <math>\ n=O(n^2)</math>, אבל <math>\ O(n^2)\ne n</math>.

===הסימון o===
בעוד הסימון O מציין כי הפונקציה <math>\ f</math> חסומה בקצב גידולה על ידי קצב הגידול של <math>\ g</math>, הרי שהסימון "o" (קרי: אוֹוּ קטן) בא לציין כי קצב הגידול של <math>\ f</math> קטן ממש יחסית לקצב הגידול של <math>\ g</math>.

בצורה פורמלית, אומרים ש-<math>\ f(n)</math> היא <math>\ o(g)</math> אם לכל קבוע <math>\ c</math>חיובי קיים <math>\ n_0</math> כך שלכל <math>\ n>n_0</math> מתקיים <math>\ f(n)<c\cdot g(n)</math>. בסימון באמצעות גבולות ניתן לתאר תכונה זו על ידי הגבול <math>\ \lim_{n\to\infty}\frac{f(n)}{g(n)}=0</math>.

===סימונים נוספים===
<math>f=\Omega(g) \equiv \exists 0<c \in \mathbb{R}, \; \exists n_0 \in \mathbb{N}\; s.t \;\forall n_0<n\in\mathbb{N} \;c\cdot g(n)\le f(n)</math>

<math>f=\omega(g) \equiv \forall 0<c \in \mathbb{R}, \; \exists n_0 \in \mathbb{N}\; s.t \;\forall n_0<n\in\mathbb{N} \;c\cdot g(n)<f(n)</math>

באמצעות הסימונים שהוגדרו לעיל נהוג להגדיר סימון נוסף:

* <math>\ f=\Theta(g)</math> אם ורק אם <math>\ f=O(g)</math> וגם <math>\ f=\Omega(g)</math>, אולם לעיתים מגדירים כי <math>f=\Theta(g)</math> אם ורק אם <math>\exists c_1, c_2>0, \exists n_0 \in \mathbb{N} \; s.t \; \forall n_0 \le n \; c_1 \cdot g(n) \le f(n) \le c_2 \cdot g(n) </math>, ולא באמצעות התנאי לעיל, למרות השקילות.

פירוש הסימון <math>\ f=\Omega(g)</math> הוא ש-<math>\ f</math> גדל לפחות בקצב של <math>\ g</math>. פירוש הסימון <math>\ f=\omega(g)</math> הוא ש-<math>\ f</math> גדל בקצב שגדול ממש מהקצב של <math>\ g</math>, ופירוש הסימון <math>\ f=\Theta(g)</math> הוא שקצבי הגידול של <math>\ f</math> ו-<math>\ g</math> הם שווים אסימפטוטית (כלומר, שתי הפונקציות הן מאותו סדר גודל).

===סיכום===
סיכום חמשת הסימונים האסימפטוטיים המקובלים מוצג בטבלה הבאה:

{| border="1" cellpadding="4" cellspacing="0"
!סימון
!הגדרה
!הגדרה מתמטית
|-
|<math>f(n) \in O(g(n))</math>
|<math>g(n)</math> חסם עליון אסימפטוטי
|<math>\limsup_{n \to \infty} \left|\frac{f(n)}{g(n)}\right| < \infty</math>
|-
|<math>f(n) \in o(g(n))</math>
|<math>g(n)</math> שולט אסימפטוטית
|<math>\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0</math>
|-
|<math>f(n) \in \Omega(g(n))</math>
|<math>g(n)</math> חסם תחתון אסימפטוטי 
|<math>\liminf_{n \to \infty} \left|\frac{f(n)}{g(n)}\right| > 0 </math>
|-
|<math>f(n) \in \omega(g(n))</math>
|<math>g(n)</math> זניח אסימפטוטית 
|<math>\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty</math>
|-
|<math>f(n) \in \Theta(g(n))</math>
|<math>g(n)</math> חסם הדוק אסימפטוטית 
|<math>0 < \liminf_{n \to \infty} \left|\frac{f(n)}{g(n)}\right| \leq \limsup_{n \to \infty} \left|\frac{f(n)}{g(n)}\right|< \infty</math>
|}
כאשר הכוונה בכך שגבול כלשהו קטן מאינסוף היא שהגבול הוא מספר ממשי.

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

לדוגמה, עבור פונקציה ממשיות <math>\ f(x)</math> ופונקציה חיובית <math>\ \phi(x)</math> אומרים ש-<math>\ f(x)=O(\phi(x))</math> כאשר <math>\ x\to x_0</math> אם קיימים <math>\ c>0,\delta>0</math> כך שלכל x בסביבה <math>N_\delta(x_0)</math> מתקיים <math>\ |f(x)| \le c \cdot\phi(x)</math>. כמו כן, אומרים ש-<math>\ f(x)=o(\phi(x))</math> כאשר <math>\ x\to x_0</math> אם לכל <math>\epsilon>0</math> קיים <math>\delta>0</math> כך שלכל x בסביבה <math>N_\delta(x_0)</math> מתקיים <math>\ |f(x)|\le\epsilon\cdot\phi(x)</math>.התנאי האחרון שקול לדרישה <math>\ \lim_{x\to x_0}\frac{f(x)}{\phi(x)}=0</math>. באופן דומה <math>\ f(x)=o(\phi(x))</math> כאשר <math>\ x\to \infty</math> אם ורק אם <math>\ \lim_{x\to \infty}\frac{f(x)}{\phi(x)}=0</math>.

==שימושים==

===ניתוח סיבוכיות אלגוריתמים===
נניח כי אלגוריתם מיון מסוים מבצע בדיוק <math>\ 4n^2-2n+1</math> פעולות בסיסיות על קלט מגודל <math>\ n</math>. ככל ש-<math>\ n</math> גדל כך ההשפעה של הגורם <math>\ n^2</math> גדלה בעוד ההשפעה של שאר הגורמים הופכת לזניחה. לדוגמה, עבור <math>\ n=500</math>, גודלו של <math>\ 4n^2</math> גדול פי 1,000 מגודלו של <math>\ 2n</math>, ופי מיליון מגודלו של <math>\ 1</math>, ולכן שני הגורמים הללו זניחים ביחס ל-<math>\ 4n^2</math> ובמרבית השימושים לא תהיה להם כל חשיבות.

בנוסף, למקדם <math>\ 4</math> של הביטוי <math>\ 4n^2</math> יש חשיבות אפסית בלבד כאשר משווים את הביטוי לביטויים גדולים יותר. למשל, אם משווים את <math>\ 4n^2</math> ל-<math>\ n^3</math>, כבר עבור <math>\ n=5</math> הביטוי <math>\ n^3</math> יהיה גדול יותר. אפילו אם המקדם של <math>\ n^2</math> יהיה 1,000,000, עבור <math>\ n=1,000,000</math> ומעלה שוב יתקבל כי <math>\ n^3</math> גדול יותר. על כן, כאשר מתעניינים בגידול האסימפטוטי של <math>\ n^2</math> אין חשיבות למקדם שלו.

בשל כך משתמשים בסימון <math>\ 4n^2-2n+1=O(n^2)</math> על מנת לייצג את המאפיין העיקרי של קצב הגידול של הביטוי שבאגף שמאל.

===חסם על קירובים===
ידוע כי ניתן לתאר את פונקציית האקספוננט <math>\ e^x</math> באמצעות טור טיילור אינסופי באופן הבא:

* <math>\ e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\dots</math>

כאשר <math>\ x\to 0</math> ונרצה לקרב עד רמת דיוק של פולינום טיילור מסדר שני, דרך פשוטה לתאר ביטוי זה באמצעות חסם אסימפטוטי היא זו:

* <math>\ e^x=1+x+\frac{x^2}{2}+o(x^2)</math>

פירושו של סימון זה הוא כי ניתן לתאר את <math>\ e^x</math> באמצעות הפונקציה <math>\ 1+x+\frac{x^2}{2}</math> ועוד פונקציית "שארית" ששייכת למחלקה <math>\ o(x^2)</math>, כלומר היא זניחה יחסית ל-<math>\ x^2</math> כאשר <math>\ x\to 0</math> - בנוסחה: <math>\lim_{x\to0}\frac{o(x^2)}{x^2}=0</math> - כלומר, השארית זניחה ביחס לאיבר האחרון בטור שמחושב באופן מדויק.

במקרה זה נכונה גם טענה חזקה יותר:

* <math>\ e^x=1+x+\frac{x^2}{2}+O(x^3)</math>

כאשר כאן השתמשנו ב-O גדול.

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

== קישורים חיצוניים ==
* 
* 

קטגוריה:סימנים מתמטיים
קטגוריה:אלגוריתמים
קטגוריה:סיבוכיות חישובית