לדלג לתוכן

מבני נתונים ואלגוריתמים - מחברת קורס/אלגוריתמים/סדרי גדילה/תרגילים

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי


תרגום ביטויים מפורשים לסדרי גדילה

[עריכה]

שאלה

[עריכה]

נתונות שתי פונקציות:

f(n)=n+c1nlog2(n)
g(n)=n+c2n2
כאשר c1>c2>0.

  1. האם f(n)=O(g(n))?
  2. האם g(n)=O(f(n))?


תשובה

[עריכה]

ראשית נראה שf(n)=O(g(n)).


הוכחה: limn→∞f(n)g(n)=
limn→∞n+c1nlog2(n)n+c2n2=
limn→∞1n+c11nlog2(n)1n+c2=
0

הטענה נובעת, לכן, מכלל הגבולות בסדרי גדילה.


כעת נראה כי g(n)≠O(f(n))


הוכחה: נניח בשלילה כי g(n)=O(f(n)). אז קיים c>0 כך שעבור ערכי n גדולים מספיק, g(n)≤c⋅f(n).

נחלק את שני האגפים בf(n) (נזכר שהוא חיובי), ונקבל g(n)f(n)≤c עבור ערכי n גדולים מספיק.

ניקח גבול של שני האגפים, ונקבל limn→∞g(n)f(n)≤limn→∞c=c.

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

שאלה בסיסית ביחסים

[עריכה]

שאלה

[עריכה]

אנא הוכח או הפרך את הטענות הבאות:

  1. 80=O(3⋅n).
  2. 2n+1003+30=O(2n).
  3. 2⋅n+7=O(2⋅n+3).
  4. 3⋅n=O(1).
  5. log2(n)=O(log10(n)).


שימו לב:

הכוונה בסעיף הראשון לפונקציה הקבועה f(n)=80,‏ ולא לקבוע 80.

תשובה

[עריכה]

נכון.


הוכחה: נבחר c=1‏ וn0=100‏,‏ ונוודא ∀n≥10080≤1⋅3⋅n.

נכון.


הוכחה: נבחר c=21008‏ וn0=1‏,‏ ונוודא ∀n≥12n+1003+30=21003⋅2n+30≤21008⋅2n.

נכון.


הוכחה: נבחר c=3‏ וn0=1‏,‏ ונוודא ∀n≥12⋅n+7≤3⋅(2⋅n+3)=6⋅n+9.


לא נכון.


הוכחה: נניח בשלילה שהטענה נכונה, ולכן עבור c>0 וn0>0 כלשהם, ∀n≥n03⋅n≤c⋅1. אם נציב n=n0+⌈c⌉, נקבל

(3⋅n)|n0+⌈c⌉=3⋅n0+3⋅⌈c⌉≤
(c⋅1)|n0+⌈c⌉=c,
שאינו הגיוני.

נכון.


הוכחה: באופן כללי, logb(a)=logc(a)/logc(b), ולכן הביטויים הם למעשה אותו ביטוי עד כדי הכפלה בקבוע.

הוכחת אדיטיביות

[עריכה]

שאלה

[עריכה]

אנא הוכח את כלל האדיטיביות לΩ: לכל f(n),g(n),‏

Ω(f(n))+Ω(g(n))=Ω(f(n)+g(n)).

תשובה

[עריכה]

ההוכחה דומה למדי להוכחת האדיטיביות שראינו בהרצאה:


הוכחה: (1) עפ"י ההגדרה:

  • f1(n)=Ω(f(n)) משמעו שלכל n≥n0,f,‏ f1(n)≥cf⋅f(n),‏ עבור cf,n0,f>0 כלשהם.
  • g1(n)=Ω(g(n)) משמעו שלכלn≥n0,g,‏ g1(n)≥g⋅g(n),‏ עבור cg,n0,g>0 כלשהם.

לכן:

  • לכל n≥max⁡{n0,f,n0,g},‏ f1(n)≥max⁡{cf,cg}⋅f(n).
  • לכל n≥max⁡{n0,f,n0,g},‏ g1(n)≥max⁡{cf,cg}⋅g(n).

מקבלים את התוצאה ע"י חיבור שני האי-שוויונים האחרונים.

הוכחת טרנזיטיבות

[עריכה]

שאלה

[עריכה]

אנא הוכח את טרנזיטיביות לΩ:


לכל f(n),g(n),

‏ f(n)=Ω(g(n))∧g(n)=Ω(h(n))⇒f(n)=Ω(h(n)).

תשובה

[עריכה]

ההוכחה דומה למדי להוכחת הטרנזיטיביות שראינו:

(1) עפ"י ההגדרה:

  • f(n)=Ω(g(n)) משמעו שלכל n≥n0,f,‏ f(n)≥cf⋅g(n),‏ עבור n0,f,cf>0 כלשהם.
  • g(n)=Ω(h(n)) משמעו שלכלn≥n0,g,‏ g(n)≥cg⋅g(n),‏ עבור n0,g,cg>0 כלשהם.

לכן:

  • לכל n≥max⁡{n0,f,n0,g},‏ f(n)≥cf⋅f(n).
  • לכל n≥max⁡{n0,f,n0,g},‏ g(n)≥cg⋅g(n).

מקבלים את התוצאה ע"י הצבת שני האי-שוויונים האחרונים אחד בשני:

  • לכל n≥max⁡{n0,f,n0,g},‏‏ f(n)≥cf⋅cg⋅h(n).

עוד כללים בסדרי גדילה

[עריכה]

שאלה

[עריכה]

f(n),g(n) הן פונקציות חיוביות ממש. אנא הוכח או הפרך כ"א מהכללים הבאים:

  1. f(n)=O(g(n))⇒g(n)=O(f(n))
  2. f(n)+g(n)=Θ(min{f(n),g(n)})
  3. f(n)=O(g(n))⇒2f(n)=O(2g(n))
  4. f(n)+Θ(f(n))=Θ(f(n))
  5. f(n)=2log⁡(n),g(n)=(log⁡(n))log⁡(n)⇒f(n)=O(g(n))


כדאי לדעת:

משמעות הביטוי בצד שמאל של סעיף 4 הוא הפונקציה f(n) פלוס פונקציה כלשהי ששייכת לΘ(f(n)).


תשובה

[עריכה]

(לתזכורת, f(n),g(n) הן פונקציות חיוביות ממש.)

  1. לא נכון. נפריך ע"י f(n)=n2,g(n)=n3.
  2. לא נכון. נפריך ע"י f(n)=n2,g(n)=n3.
  3. לא נכון. נפריך ע"י f(n)=2⋅n,g(n)=n.
  4. לכל פונקציה g(n)=Θ(f(n)) מתקיים שc″⋅f(n)≤g(n)≤c′⋅f(n), עבור c″,c′>0 כלשהם, החל מn0>0 כלשהו. לכן, החל מאותו n0,‏‏ (1+c″)⋅f(n)≤f(n)+g(n)≤(1+c′)⋅f(n),
    ‏ מה שמוכיח את הטענה.
  5. limn→∞[f(n)/g(n)]=0 (לפי כללים פשוטים מחדו"א),

ולכן עפ"י כללי הגבולות שראינו, הטענה נכונה.

כללים לגבי מקסימום

[עריכה]

שאלה

[עריכה]

אנא הוכח או הפרך כ"א מהכללים הבאים:

  1. f(n)+g(n)=Θ(max⁡{f(n),g(n)})
  2. f(n)−g(n)=Θ(max⁡{f(n),g(n)})


תשובה

[עריכה]

נשים לב שתמיד מתקיים:

f(n)+g(n)≥max⁡{f(n),g(n)},
f(n)+g(n)≤2⋅max⁡{f(n),g(n)}.
הטענה, לכן, נכונה.

ניקח f(n)=n+1, וg(n)=n. קל לראות שf(n)−g(n)=1≠Θ(n)=Θ(max⁡{f(n),g(n)}):‏ הוכחנו בכיתה שn2≠O(n), ובאותו אופן בדיוק אפשר להראות ש 1≠Ω(n). הטענה, לכן, איננה נכונה.


כלל שלילי בגבולות

[עריכה]

שאלה

[עריכה]

f(n) וg(n) הן פונקציות חיוביות ממש, והגבול limn→∞[f(n)/g(n)] קיים ושווה לlimn→∞[f(n)/g(n)]=c. אנא הוכח או הפרך את הטענה הבאה: אם c=0 או c=∞,‏ אז f(n)≠Θ(g(n)).


תשובה

[עריכה]

הטענה נכונה.


הוכחה: נניח בשלילה שהטענה מוטעית, ואכן f(n)=Θ(g(n)). עפ"י ההגדרה, לכן, קיימים שני קבועים c″>0 וc′>0 כך שלערכי n גדולים מספיק, c″⋅g(n)≤f(n)≤c′⋅g(n). נחלק בg(n) (שימו לב שאין צורך להפוך את סימני ≤), ונקבל c″≤f(n)/g(n)≤c′. מכללים ידועים בחדו"א, הוכחנו כעת שגבול המנה (אם הוא קיים) חסום בין c″ לc′, בסתירה לנתון בשאלה.


באופן דומה למדי, נוכל להוכיח את המשפט הבא:



משפט:

f(n) וg(n) הן פונקציות חיוביות ממש, והגבול limn→∞[f(n)/g(n)] קיים ושווה לlimn→∞[f(n)/g(n)]=c.

  1. אם c=0 אז f(n)≠Ω(g(n)).
  2. אם c=∞ אז f(n)≠O(g(n)).


יחסים בין פולינומים

[עריכה]

שאלה

[עריכה]

f(n),g(n) פולינומים בעלי מקדמים חיוביים. אנא מצא כלל פשוט לקביעת סדרי הגדילה ביניהם.


תשובה

[עריכה]

נניח שf(n) פולינום מדרגה f, וg(n) פולינום מדרגה g. אז:

  • f<g⇒f(n)=O(g(n))
  • f=g⇒f(n)=Θ(g(n))
  • f>g⇒f(n)=Ω(g(n))

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


הכוון השני לכללי הגבולות

[עריכה]

שאלה

[עריכה]

f(n) היא פונקציה חיובית ממש, מונוטונית עולה, ושואפת לאינסוף. אנא הוכח שקיימת פונקציה g(n) כך שמתקיים f(n)=Θ(g(n)) אבל הגבול f(n)/g(n) אינו קיים.


תשובה

[עריכה]

נבנה את הפונקציה g(n) כך:

  1. ראשית נקבע צמדים של נקודות.
    1. נקבע n0=1,‏ וn1 כנקודה הקטנה ביותר בה f(n1)≥2⋅f(n0) ‏(חייבת להיות נקודה כזו, כי f(n) שואפת לאינסוף)‏‏.
    2. נקבע n2=n1+1,‏ וn3 כנקודה הקטנה ביותר בה f(n3)≥2⋅f(n2) (חייבת להיות נקודה כזו, כי f(n) שואפת לאינסוף)‏.
    3. נמשיך כך הלאה: נקבע n4=n3+1,‏ וn5 כנקודה הקטנה ביותר בה f(n5)≥2⋅f(n4) (חייבת להיות נקודה כזו, כי f(n) שואפת לאינסוף)‏, וכולי.
  2. כעת נגדיר את g(n) בעזרת הזוגות:
    1. עבור n0≤n<n1,‏ g(n)=f(n0);‏ g(n1)=f(n1)/2.
    2. עבור n2≤n<n3,‏ g(n)=f(n2);‏ g(n3)=f(n3)/2.
    3. עבור n4≤n<n5,‏ g(n)=f(n4);‏ g(n5)=f(n5)/2. נמשיך כך הלאה והלאה.מהבניה קל לראות את הדברים הבאים:
    4. g(n) פונקציה מונוטונית עולה.
    5. בכל נקודה ונקודה, g(n) נמצאת בין f(n) לf(n)/2. לכן g(n)=Θ(f(n)) בהכרח.
    6. יש אינסוף נקודות בהן f(n)=g(n), אבל גם אינסוף נקודות בהן g(n)=f(n)/2, ולכן לא ייתכן שהגבול f(n)/g(n) קיים.


כדאי לדעת:

לכאורה אפשר לבנות פונקציה g1(n) פשוטה הרבה יותר מהמוצגת כאן, לדוגמה:
  1. g1(n)=f(n) אם n זוגי.
  2. g1(n)=f(n)/2 אם n אי זוגי.

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

טור פולינומים

[עריכה]

שאלה

[עריכה]

n0,k הם שני קבועים שלמים גדולים ממש מ1. אנא הוכח שמתקיים ∑i=n0n[ik]=Θ(nk+1).


תשובה

[עריכה]

היות שn0,k הם שני קבועים שלמים גדולים ממש מ1, אז ik היא פונקציה מונוטונית עולה בתחום המתאים, ונוכל להשתמש בכלל הראשון של חסמי האינטגרלים. בנוסף, נזכר ש∫xkdx=xk+1/(k+1)+C (עבור C כלשהו). הצבה פשוטה משלימה את ההוכחה.

טור כפול

[עריכה]

שאלה

[עריכה]

הפונקציה T(n) נתונה על ידי הנוסחה. T(n)=∑i=1n∑j=in[Θ(j−i+1)].

אנא הוכח T(n)=Θ(n3).


רמז

נסה להוכיח זאת באותו אופן בו הוכחנו ∑i=1n[log⁡(i)]=Θ(n⋅log⁡(n)). כלומר:

  1. הוכח בנפרד חסמי O וΩ.
  2. ערוך מניפולציות על איבר הטור הכללי ועל גבולות הסיכום כך שיתקבל איבר טור שאינו תלוי בגבולות הסיכום (ולכן ניתן יהיה להוציאו מחוץ לסכום).


תשובה

[עריכה]
שיטה א'
[עריכה]

נשתמש באותו הרעיון בו השתמשתנו כדי לנתח טור של לוגריתמים.


ראשית נראה כי f(n)=O(n3).


הוכחה: f(n)=∑i=1n∑j=in[Θ(j−i+1)]≤∑i=1n∑j=1n[Θ(n)]=Θ(n3)
.

כעת נראה כי f(n)=Ω(n3).


הוכחה: f(n)=∑i=1n∑j=in[Θ(j−i+1)]≥∑i=1n/4∑j=in[Θ(j−i+1)]≥∑i=1n/4∑j=3n/4n[Θ(j−i+1)].
נשים לב שכאשר i בתחום 1,…,n/4 וj בתחום 3n/4,…,n, אז Θ(j−i+1)=Ω(n/2)=Ω(n).

לכן נקבל

f(n)≥∑i=1n/4∑j=3n/4n[Ω(n)]=Θ(n3).

שיטה ב'
[עריכה]

f(n)=∑i=1n∑j=in[Θ(j−i+1)].

נשים לב שעבור ערך i כלשהו, נוכל לבצע את החלפת המשתנים j′=j−i, ונקבל ∑j=in[Θ(j−i+1)]=∑j′=0n−i[Θ(j′+1)]=∑j′=0n−i[Θ(j′)]=Θ((n−i)2) .

נציב זאת חזרה בסכום הכפול: f(n)=∑i=1n∑j=in[Θ(j−i+1)]=∑i=1n[(n−i)2] .


נבצע החלפת משתנים i′=n−i, ונקבל:

f(n)=∑i=1n[(n−i)2]=∑i′=0n−1[i'2]=Θ(n3) .


חסם על טור לבניית ערימה בינרית ממערך

[עריכה]

שאלה

[עריכה]

אנא הוכח ש∑j=1h[2−jΘ(j)]=Θ(1).


רמז

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


כדאי לדעת:

נצטרך חסם זה כשננתח את סיבוכיות בניית ערימה בינרית ממערך.

תשובה

[עריכה]

מצד אחד, כל טור גדול לפחות כמו איברו הראשון. מכאן נקבל: ∑j=1h[2−jΘ(j)]≥[2−1Θ(1)]≥Θ(1) ולכן הטור המקורי הוא Ω(1).

מצד שני, נקבל ∑j=1h[2−jΘ(j)]≤∑j=1∞[2−jΘ(j)]=Θ(∑j=1∞[2−jj]), ולכן נחסום מלמעלה את ∑j=1∞[2−jj].

עבור ערכי j מספיק גדולים, 2−jj<1.5−j (קל לראות זאת מל'וספיטל, לדוגמה). נגדיר את k כאינדקס הראשון בו 2−kk<1.5−k. נקבל ∑j=1∞[2−jj]=∑j=1k−1[2−jj]+∑j=k∞[2−jj]≤O(1)+∑j=k∞[1.5−j]≤O(1)+∑j=1∞[1.5−j]=O(1)+O(1)=O(1)


כדאי לדעת:

אפשר לפתור את התרגיל גם בעזרת חסמי האינטגרלים לטורים שראינו.