חזור לתיקייה: תרגול

1 - סיבוכיות (מההקלטה)

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • ההגדרות הבסיסיות
  • משפטים על החסמים
  • חישוב זמן ריצה של תוכנית
  • סימונים אחרונים לתרגול

1 - סיבוכיות (מההקלטה)

02340218

מבני נתונים 1

רשימות תרגול לקריאה בשבת

סיבוכיות (מההקלטה)

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

קצת על המבנה של הקורס:

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

ההגדרות הבסיסיות

הגדרה 1 (חסם עליון)

יהיו f(n),g(n):N→R+f(n),g(n):\mathbb{N}\to \mathbb{R}^+f(n),g(n):N→R+.
נאמר כי f(n)=O(g(n))f(n)={\Large O(}g(n){\Large)}f(n)=O(g(n)) אם קיימים c,n0∈R+c,n_{0} \in \mathbb{R}^+c,n0​∈R+ כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים: f(n)≤c⋅g(n)f(n)\leq c\cdot g(n)f(n)≤c⋅g(n).

הגדרה 2 (חסם תחתון)

יהיו f(n),g(n):N→R+f(n),g(n):\mathbb{N}\to \mathbb{R}^+f(n),g(n):N→R+.
נאמר כי f(n)=Ω(g(n))f(n)={\Large\Omega(}g(n){\Large)}f(n)=Ω(g(n)) אם קיימים c,n0∈R+c,n_{0}\in \mathbb{R}^+c,n0​∈R+ כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים f(n)≥c⋅g(n)f(n)\geq c\cdot g(n)f(n)≥c⋅g(n).

הגדרה 3 (חסם הדוק)

יהיו f(n),g(n):N→R+f(n),g(n):\mathbb{N}\to \mathbb{R}^+f(n),g(n):N→R+.
נאמר כי f(n)=Θ(g(n))f(n)={\Large\Theta(}g(n){\Large)}f(n)=Θ(g(n)) אם f(n)=Ω(g(n))∧f(n)=O(g(n))f(n)=\Omega(g(n))\land f(n)=O(g(n))f(n)=Ω(g(n))∧f(n)=O(g(n)).

דוגמה

יהי p(n)∈Nk[n]p(n)\in \mathbb{N}_{k}[n]p(n)∈Nk​[n] שמקדמיו חיוביים. כלומר:

p(n)=a0+a1n+⋯+aknk=∑i=0kainiai≥0,ak>0p(n)=a_{0}+a_{1}n+\dots+a_{k}n^k=\sum_{i=0}^k a_{i}n^i \qquad \qquad a_{i}\geq 0, a_{k}>0p(n)=a0​+a1​n+⋯+ak​nk=i=0∑k​ai​niai​≥0,ak​>0

נרצה להראות כי p(n)=O(nk)p(n)=O(n^k)p(n)=O(nk). עבור כך נרצה למצוא קבועים c,n0>0c,n_{0}>0c,n0​>0 כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים p(n)≤c⋅nkp(n)\leq c\cdot n^kp(n)≤c⋅nk.
נשים לב כי לכל 0≤i≤k0\leq i\leq k0≤i≤k ולכל n≥1n\geq 1n≥1 מתקיים ni≤nkn^i\leq n^kni≤nk ולכן נקבל כי:

p(n)=∑i=0kaini≤∑i=0kaink=(∑i=0kai)nkp(n)=\sum_{i=0}^k a_{i}n^i\leq \sum_{i=0}^ka_{i}n^k=\left( \sum_{i=0}^ka_{i} \right)n^kp(n)=i=0∑k​ai​ni≤i=0∑k​ai​nk=(i=0∑k​ai​)nk

ולכן, עבור n0=1,c=∑i=0kain_{0}=1,c=\sum\limits_{i=0}^ka_{i}n0​=1,c=i=0∑k​ai​ מתקיים כי p(n)≤c⋅nkp(n)\leq c\cdot n^kp(n)≤c⋅nk ולכן p(n)=O(nk)p(n)=O(n^k)p(n)=O(nk).

כעת, נרצה להראות כי p(n)=Ω(nk)p(n)=\Omega(n^k)p(n)=Ω(nk). נשים לב כי לכל n≥1n\geq 1n≥1 מתקיים כי:

∑i=0kaini=a0+a1n+⋯+aknk≥aknk\sum_{i=0}^k a_{i}n^i=a_{0}+a_{1}n+\dots+a_{k}n^k\geq a_{k}n^ki=0∑k​ai​ni=a0​+a1​n+⋯+ak​nk≥ak​nk

ולכן, עבור n0=1,c=akn_{0}=1,c=a_{k}n0​=1,c=ak​ נקבל כי p(n)≥c⋅nkp(n)\geq c\cdot n^kp(n)≥c⋅nk ובכך p(n)=Ω(nk)p(n)=\Omega(n^k)p(n)=Ω(nk).

מסקנה

לפי הגדרה מתקיים כי p(n)=Θ(nk)p(n)=\Theta(n^k)p(n)=Θ(nk).

תרגיל

הראו כי לכל קבוע k≥2k\geq 2k≥2 מתקיים:

∑i=0nki=1+k+⋯+kn=O(kn)\sum_{i=0}^nk^i = 1+k+\dots+k^n=O(k^n)i=0∑n​ki=1+k+⋯+kn=O(kn)

נשתמש בסכום סדרה הנדסית:

∑i=0nki=kn+1−1k−1≤kn+1k−1\sum_{i=0}^n k^i=\frac{k^{n+1}-1}{k-1}\leq \frac{k^{n+1}}{k-1}i=0∑n​ki=k−1kn+1−1​≤k−1kn+1​

מכיוון ש-k≥2k\geq 2k≥2 מתקיים כי k−1≥12kk-1\geq \frac{1}{2}kk−1≥21​k ולכן:

∑i=0nki≤kn+112k=2kn\sum_{i=0}^n k^i\leq \frac{k^{n+1}}{\frac{1}{2}k}=2k^ni=0∑n​ki≤21​kkn+1​=2kn

ולכן, לפי הגדרה ∑i=0nki=O(kn)\sum_{i=0}^nk^i=O(k^n)∑i=0n​ki=O(kn).

תרגיל

הוכיחו כי log⁡(n!)=Θ(nlog⁡n)\log (n!)=\Theta(n\log n)log(n!)=Θ(nlogn).

הוכחה:
נראה כי log⁡(n!)=O(nlog⁡n)\log(n!)=O(n\log n)log(n!)=O(nlogn) תחילה. לפי הגדרה נקבל:

log⁡(n!)=log⁡(1⋅2⋯n)=log⁡1+log⁡2+⋯+log⁡n≤↓ היא פונקציה מונוטוניתlog⁡nnlog⁡n\log(n!)=\log(1\cdot2\cdots n)=\log1+\log 2+\dots +\log n \underset{\begin{matrix} \downarrow \\ \R{\text{ היא פונקציה מונוטונית}} \log n \end{matrix}}{\leq}n\log nlog(n!)=log(1⋅2⋯n)=log1+log2+⋯+logn↓ היא פונקציה מונוטוניתlogn​≤​nlogn

לכן, עבור c=1,n0=1c=1,n_{0}=1c=1,n0​=1 נקבל כי log⁡n!=O(nlog⁡n)\log n! = O(n\log n)logn!=O(nlogn).

כעת, נראה כי log⁡(n!)=Ω(nlog⁡n)\log(n!)=\Omega(n\log n)log(n!)=Ω(nlogn).

log⁡(n!)=log⁡1+log⁡2+⋯+log⁡n2+⋯+log⁡n≥log⁡n2+⋯+log⁡n≥n2log⁡n2=n2(log⁡n−log⁡2)=n2log⁡n−n2\begin{align*} \log (n!)&=\log1+\log2+\dots+\log \frac{n}{2}+\dots+\log n\geq \log \frac{n}{2}+\dots+\log n\geq \frac{n}{2}\log \frac{n}{2} \\ &=\frac{n}{2}(\log n-\log 2)=\frac{n}{2}\log n -\frac{n}{2} \end{align*}log(n!)​=log1+log2+⋯+log2n​+⋯+logn≥log2n​+⋯+logn≥2n​log2n​=2n​(logn−log2)=2n​logn−2n​​
הערה (טריק שיחזור בכמה מקומות)

אם אנחנו פוגשים פונקציה שהיא אינטואיטיבית גדולה מפונקציה אחרת, אנחנו יכולים לפצל אותה ולבטל איכשהו את הפונקציה הקטנה יותר.

log⁡(n!)≥n2log⁡n−n2=n4log⁡n+n4(log⁡n−2)≥n4log⁡n\log(n!)\geq \frac{n}{2}\log n-\frac{n}{2}= \frac{n}{4}\log n+\frac{n}{4}(\log n-2)\geq \frac{n}{4}\log nlog(n!)≥2n​logn−2n​=4n​logn+4n​(logn−2)≥4n​logn

נשים לב כי השלב האחרון מתקיים רק עבור n≥4n\geq4n≥4 שכן log⁡n−2≥0\log n-2\geq 0logn−2≥0 עבור n≥4n\geq 4n≥4.

הערה

הלוג ה"רגיל" במדעי המחשב הוא log⁡2\log_{2}log2​ ולכן כל ה-log⁡\loglog-ים פה היו log⁡2\log_{2}log2​ בסתר.

לכן מתקיים כי log⁡(n!)=Ω(nlog⁡n)\log(n!)=\Omega(n\log n)log(n!)=Ω(nlogn) עם c=14,n0=4c=\frac{1}{4},n_{0}=4c=41​,n0​=4 בהגדרה.
לכן, לפי הגדרה log⁡(n!)=Θ(nlog⁡n)\log(n!)=\Theta(n\log n)log(n!)=Θ(nlogn).
∎

משפטים על החסמים

משפט

יהיו f1,f2,g1,g2:N→Rf_{1},f_{2},g_{1},g_{2}:\mathbb{N}\to \mathbb{R}f1​,f2​,g1​,g2​:N→R כך ש: f1(n)=O(g1(n))f_{1}(n)=O(g_{1}(n))f1​(n)=O(g1​(n)) ו-f2(n)=O(g2(n))f_{2}(n)=O(g_{2}(n))f2​(n)=O(g2​(n)). אזי:

  1. מתקיים f1(n)+f2(n)=O(g1(n)+g2(n))f_{1}(n)+f_{2}(n)=O(g_{1}(n)+g_{2}(n))f1​(n)+f2​(n)=O(g1​(n)+g2​(n)).
  2. מתקיים f1(n)+f2(n)=O(max⁡{g1(n),g2(n)})f_{1}(n)+f_{2}(n)=O(\max\left\{ g_{1}(n),g_{2}(n) \right\})f1​(n)+f2​(n)=O(max{g1​(n),g2​(n)})
  3. מתקיים f1(n)⋅f2(n)=O(g1(n)⋅g2(n))f_{1}(n)\cdot f_{2}(n)=O(g_{1}(n)\cdot g_{2}(n))f1​(n)⋅f2​(n)=O(g1​(n)⋅g2​(n)).

הוכחה:
קיימים קבועים c1,n01>0c_{1},n_{01}>0c1​,n01​>0 כך שלכל n≥n01n\geq n_{01}n≥n01​ מתקיים f1(n)≤c1g1(n)f_{1}(n)\leq c_{1}g_{1}(n)f1​(n)≤c1​g1​(n) וקיימים קבועים c2,n02>0c_{2},n_{02}>0c2​,n02​>0 כך שלכל f2(n)≤c2g2(n)f_{2}(n)\leq c_{2}g_{2}(n)f2​(n)≤c2​g2​(n).
לכן:

f1(n)+f2(n)≤c1g1(n)+c2g2(n)≤(c1+c2)g1(n)+(c1+c2)g2(n)=(c1+c2)(g1(n)+g2(n))f_{1}(n)+f_{2}(n)\leq c_{1}g_{1}(n)+c_{2}g_{2}(n)\leq(c_{1}+c_{2})g_{1}(n)+(c_{1}+c_{2})g_{2}(n)=(c_{1}+c_{2})(g_{1}(n)+g_{2}(n))f1​(n)+f2​(n)≤c1​g1​(n)+c2​g2​(n)≤(c1​+c2​)g1​(n)+(c1​+c2​)g2​(n)=(c1​+c2​)(g1​(n)+g2​(n))

ולכן, עבור c=c1+c2,n0=max⁡{n01,n02}c=c_{1}+c_{2},n_{0}=\max\left\{ n_{01},n_{02} \right\}c=c1​+c2​,n0​=max{n01​,n02​} מתקיים לפי הגדרה כי f1(n)+f2(n)=O(g1(n)+g2(n))f_{1}(n)+f_{2}(n)=O(g_{1}(n)+g_{2}(n))f1​(n)+f2​(n)=O(g1​(n)+g2​(n)).
באותו האופן נקבל גם כי:

f1(n)+f2(n)≤(c1+c2)(g1(n)+g2(n))≤(c1+c2)⋅2max⁡{g1(n),g2(n)}f_{1}(n)+f_{2}(n)\leq (c_{1}+c_{2})(g_{1}(n)+g_{2}(n))\leq(c_{1}+c_{2})\cdot 2\max\left\{ g_{1}(n),g_{2}(n) \right\}f1​(n)+f2​(n)≤(c1​+c2​)(g1​(n)+g2​(n))≤(c1​+c2​)⋅2max{g1​(n),g2​(n)}

ולכן, עבור c=2(c1+c2),n0=max⁡{n01,n02}c=2(c_{1}+c_{2}),n_{0}=\max\left\{ n_{01},n_{02} \right\}c=2(c1​+c2​),n0​=max{n01​,n02​} מתקיים לפי הגדרה כי f1(n)+f2(n)=O(max⁡{g1(n),g2(n)})f_{1}(n)+f_{2}(n)=O(\max\left\{ g_{1}(n),g_{2}(n) \right\})f1​(n)+f2​(n)=O(max{g1​(n),g2​(n)}).
לבסוף, נקבל גם כי:

f1(n)⋅f2(n)≤c1⋅g1(n)⋅c2⋅g2(n)=(c1⋅c2)(g1(n)⋅g2(n))f_{1}(n)\cdot f_{2}(n)\leq c_{1}\cdot g_{1}(n)\cdot c_{2}\cdot g_{2}(n)= (c_{1}\cdot c_{2})(g_{1}(n)\cdot g_{2}(n))f1​(n)⋅f2​(n)≤c1​⋅g1​(n)⋅c2​⋅g2​(n)=(c1​⋅c2​)(g1​(n)⋅g2​(n))

ולכן, עבור c=c1c2,n0=max⁡{n01,n02}c=c_{1}c_{2},n_{0}=\max\left\{ n_{01},n_{02} \right\}c=c1​c2​,n0​=max{n01​,n02​} מתקיים לפי הגדרה כי f1(n)⋅f2(n)=O(g1(n)⋅g2(n))f_{1}(n)\cdot f_{2}(n)=O(g_{1}(n)\cdot g_{2}(n))f1​(n)⋅f2​(n)=O(g1​(n)⋅g2​(n)).
∎

תרגיל

האם מתקיים כי f1(n)f2(n)=O(g1(n)g2(n))f_{1}(n)^{f_{2}(n)}=O(g_{1}(n)^{g_{2}(n)})f1​(n)f2​(n)=O(g1​(n)g2​(n))?

התשובה היא לא

הערה

בשאלות מסוג אלו תמיד כדאי לנסות להפריך קודם.

נסתכל למשל על הפונקציות f1(n)=g1(n)=nf_{1}(n)=g_{1}(n)=nf1​(n)=g1​(n)=n ו-f2(n)=2,g2(n)=1f_{2}(n)=2,g_{2}(n)=1f2​(n)=2,g2​(n)=1.
הטענה n2=O(n)n^2=O(n)n2=O(n) אינה נכונה ונראה זאת באמצעות הנחה בשלילה.
נניח בשלילה כי קיימים c,n0>0c,n_{0}>0c,n0​>0 עבורם לכל n≥n0n\geq n_{0}n≥n0​ מתקיים n2≤c⋅nn^2\leq c\cdot nn2≤c⋅n נחלק ב-nnn שכן n≠0n\neq 0n=0 ונקבל כי:

n≤cn\leq cn≤c

מה שאינו נכון אם נקח n=max⁡{n0,c+1}n=\max\left\{ n_{0},c+1 \right\}n=max{n0​,c+1} ולכן הגענו לסתירה ומתקיים כי n2≠O(n)n^2\neq O(n)n2=O(n).

חישוב זמן ריצה של תוכנית

scanf("%d", &n);
int k = 2;

while (k < n)
{
	k += 1;
}

הפקודות מחוץ ללולאה הינן O(1)O(1)O(1) ועלות איטרציה יחידה היא O(1)O(1)O(1).
מספר האינטרציות הוא n−2n-2n−2 ולכן סך זמן הריצה של התוכנית הוא O(n)O(n)O(n).

 בסוף האיטרציהkמספר האיטרציה203142⋮⋮i+2i⋮⋮nn−2\begin{array}{c|c} \R{\text{ בסוף האיטרציה}}k & \R{\text{מספר האיטרציה}} \\ \hline 2 & 0 \\ 3 & 1 \\ 4 & 2 \\ \vdots & \vdots \\ i+2 & i \\ \vdots & \vdots \\ n & n-2 \\ \hline \end{array} בסוף האיטרציהk234⋮i+2⋮n​מספר האיטרציה012⋮i⋮n−2​​
scanf("%d", &n);
int k = 2;

while (k < n)
{
	k = k * 2;
}

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

2i⋅2≥n  ⟹  i+1≥log⁡2n  ⟹  i≥log⁡2n−12^i\cdot 2\geq n \implies i+1\geq \log_{2}n\implies i\geq \log_{2}n-12i⋅2≥n⟹i+1≥log2​n⟹i≥log2​n−1

לכן, סך זמן הריצה של התוכנית הוא O(log⁡n)O(\log n)O(logn).

scanf("%d", &n);
int k = 2;

while (k < n)
{
	k = k * k * k;
}

בתוכנית זו אנחנו משנים את kkk באופן דרסטי ובעצם עושים k=k3k=k^3k=k3 ולכן האיטרציה אחרונה תתרחש כאשר 23i≥n2^{3^i}\geq n23i≥n ולכן:

3i≥log⁡n  ⟹  i≥log⁡3(log⁡2n)3^i\geq \log n \implies i\geq \log_{3}(\log_{2}n)3i≥logn⟹i≥log3​(log2​n)

ולכן סך זמן הריצה הוא O(log⁡log⁡n)O(\log \log n)O(loglogn).

סימונים אחרונים לתרגול

הגדרה 4

נאמר כי f(n)=o(g(n))f(n)=o(g(n))f(n)=o(g(n)) אם לכל c>0c>0c>0 קיים n0>0n_{0}>0n0​>0 כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים f(n)≤c⋅g(n)f(n)\leq c\cdot g(n)f(n)≤c⋅g(n).

משפט (הגדרה שקולה)

נאמר ש-f(n)=o(g(n))f(n)=o(g(n))f(n)=o(g(n)) אם ורק אם lim⁡n→∞f(n)g(n)=0\lim_{ n \to \infty } \frac{f(n)}{g(n)}=0limn→∞​g(n)f(n)​=0.

הגדרה 5

נאמר ש-f(n)=ω(g(n))f(n)=\omega(g(n))f(n)=ω(g(n)) אם לכל c>0c>0c>0 קיים n0>0n_{0}>0n0​>0 כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים f(n)≥c⋅g(n)f(n)\geq c\cdot g(n)f(n)≥c⋅g(n).

משפט (הגדרה שקולה)

lim⁡n→∞g(n)f(n)=0  ⟺  f(n)=ω(g(n))\lim_{ n \to \infty } \frac{g(n)}{f(n)}=0 \iff f(n)=\omega(g(n))n→∞lim​f(n)g(n)​=0⟺f(n)=ω(g(n))
טענה

לכל קבוע ε>0\epsilon>0ε>0 מתקיים כי log⁡n=o(nε)\log n=o(n^\epsilon)logn=o(nε).

הוכחה:
נוכיח את הטענה לפי ההגדרה השקולה של ooo. כלומר, נראה כי lim⁡n→∞log⁡nnε=0\lim_{ n \to \infty } \frac{\log n}{n^\epsilon}=0limn→∞​nεlogn​=0.
לפי כלל לופיטל נקבל כי:

lim⁡n→∞log⁡nnε=lim⁡n→∞1ln⁡21nε⋅nε−1=lim⁡n→∞1εln⁡21nε=0\lim_{ n \to \infty } \frac{\log n}{n^\epsilon}=\lim_{ n \to \infty } \frac{\frac{1}{\ln2} \frac{1}{n}}{\epsilon\cdot n^{\epsilon-1}}=\lim_{ n \to \infty } \frac{1}{\epsilon \ln2} \frac{1}{n^\epsilon}=0n→∞lim​nεlogn​=n→∞lim​ε⋅nε−1ln21​n1​​=n→∞lim​εln21​nε1​=0

∎

תרגיל

נתונות פונקציות f,g:N→R+f,g:\mathbb{N}\to \mathbb{R}^+f,g:N→R+.
נגדיר f(n)=S(g(n))f(n)=S(g(n))f(n)=S(g(n)) אם מתקיים f(n)=O(∑i=1ng(i))f(n)=O\left( \sum_{i=1}^n g(i)\right)f(n)=O(∑i=1n​g(i)).

הוכח/הפרך:
א. n2=S(n)n^2=S(n)n2=S(n).
ב. n=S(log⁡n)n=S(\log n)n=S(logn)
ג. f(n)=S(g(n))f(n)=S(g(n))f(n)=S(g(n)) וגם g(n)=S(h(n))g(n)=S(h(n))g(n)=S(h(n)) אז f(n)=S(h(n))f(n)=S(h(n))f(n)=S(h(n)).

פתרון א':
הטענה נכונה.

הערה (אינטואיציה)

אם אנחנו לוקחים את הסכום זה סכום של סדרה חשבונית וכבר ראינו שסכום של פונקציות זה O(הפונקציה המקסימלית)O(\R{\text{הפונקציה המקסימלית}})O(הפונקציה המקסימלית)

הוכחה:
נרצה להראות כי n2=O(∑i=1ni)n^2=O\left( \sum_{i=1}^n i \right)n2=O(∑i=1n​i), כלומר, נרצה להראות כי קיימים קבועים c,n0>0c,n_{0}>0c,n0​>0 כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים:

n2≤c∑i=1ni=cn(n+1)2=12c(n2+n)n^2\leq c \sum_{i=1}^n i=c \frac{n(n+1)}{2}=\frac{1}{2}c (n^2+n)n2≤ci=1∑n​i=c2n(n+1)​=21​c(n2+n)

אם נבחר c=2c=2c=2 נקבל n2≤n2+nn^2\leq n^2+nn2≤n2+n וברור כי זה מתקיים לכל n∈N+n \in \mathbb{N}^+n∈N+.
∎

פתרון ב':
הטענה גם כן נכונה.
הוכחה:
נרצה להראות כי n=O(∑i=1nlog⁡i)n=O\left( \sum_{i=1}^n \log i \right)n=O(∑i=1n​logi). כלומר, שקיימים קבועים c,n0>0c,n_{0}>0c,n0​>0 כך שלכל n≥n0n\geq n_{0}n≥n0​ מתקיים:

n≤c∑i=1nlog⁡i=clog⁡(n!)n\leq c\sum_{i=1}^n \log i=c\log(n!)n≤ci=1∑n​logi=clog(n!)

נזכר כי ראינו ממקודם כי log⁡(n!)=Θ(nlog⁡n)\log(n!)=\Theta(n\log n)log(n!)=Θ(nlogn) ולכן, מתקיים log⁡(n!)=Ω(nlog⁡n)\log(n!)=\Omega(n\log n)log(n!)=Ω(nlogn). כלומר, קיימים קבועים c′,n0′>0c',n_{0}'>0c′,n0′​>0 כך שלכל n≥n0′n\geq n_{0}'n≥n0′​ מתקיים:

log⁡(n!)≥c′⋅nlog⁡n  ⟹  1c′log⁡(n!)≥nlog⁡n\log (n!)\geq c'\cdot n\log n\implies \frac{1}{c'}\log(n!)\geq n\log nlog(n!)≥c′⋅nlogn⟹c′1​log(n!)≥nlogn

נשים לב כי לכל n≥2n\geq 2n≥2 מתקיים nlog⁡n≥nn\log n\geq nnlogn≥n ולכן לכל n≥n0=max⁡{2,n0′}n\geq n_{0}=\max\left\{ 2,n_{0}' \right\}n≥n0​=max{2,n0′​} מתקיים n≤c⋅log⁡(n!)n\leq c\cdot \log(n!)n≤c⋅log(n!) כאשר c=1c′c=\frac{1}{c'}c=c′1​.
∎

פתרון ג':
הטענה אינה נכונה.
נראה דוגמה נגדית באמצעות הפונקציות f(n)=n2,g(n)=n,h(n)=log⁡nf(n)=n^2,g(n)=n,h(n)=\log nf(n)=n2,g(n)=n,h(n)=logn.
בסעיפים א' ו-ב' ראינו כי n2=S(n)n^2=S(n)n2=S(n) וכי n=S(log⁡n)n=S(\log n)n=S(logn) אולם הטענה n2=S(log⁡n)n^2=S(\log n)n2=S(logn) אינה נכונה.
נניח בשלילה כי n22=S(log⁡n)n^22=S(\log n)n22=S(logn), כלומר, קיימים קבועים c,n0>0c,n_{0}>0c,n0​>0 כך ש-n2≤c∑i=1nlog⁡i=clog⁡(n!)n^2\leq c\sum_{i=1}^n\log i=c\log(n!)n2≤c∑i=1n​logi=clog(n!).
ראינו בתחילת התרגול כי log⁡(n!)=Θ(nlog⁡n)\log(n!)=\Theta(n\log n)log(n!)=Θ(nlogn) ולכן בפרט log⁡(n!)=O(nlog⁡n)\log (n!)=O(n\log n)log(n!)=O(nlogn). כלומר, קיימים קבועים c′,n0′>0c',n_{0}'>0c′,n0′​>0 כך שלכל n≥n0′n\geq n_{0}'n≥n0′​ מתקיים log⁡(n!)≤c′⋅nlog⁡n\log(n!)\leq c'\cdot n\log nlog(n!)≤c′⋅nlogn.
לכן, לכל n≥max⁡{n0,n0′}n\geq \max\left\{ n_{0},n_{0}' \right\}n≥max{n0​,n0′​} מתקיים:

n2≤c⋅c′⋅nlog⁡n  ⟹  n≤c⋅c′⋅log⁡nn^2\leq c\cdot c'\cdot n\log n\implies n\leq c\cdot c'\cdot \log nn2≤c⋅c′⋅nlogn⟹n≤c⋅c′⋅logn

בסתירה לכך ש-log⁡n=o(n)\log n=o(n)logn=o(n).