MAT2033 · 6. hafta · growth of functions and complexity of algorithms

Fonksiyonların büyümesi ve algoritma karmaşıklığı

Big-O, Big-Omega ve Big-Theta tanımları, tanık (witness) bulma, 'O değildir' ispatı, büyüme sıralaması ve döngü sayma. Vizenin son konusu.

Big-O notationBig-OmegaBig-Thetawitnessesgrowth of functionstime complexityworst-case complexitylinear searchbinary searchbubble sort

Bu hafta vizenin son konusu. Soru tipleri belli ve mekanik: “Show that f is O(g), give witnesses”, “show that f is not O(g)”, “arrange in order of growth” ve “how many times is this line executed?”. Hepsinin bir şablonu var. Altın kurallar:

  1. Big-O bir üst sınırdır. Saniye ölçmez, girdi büyüdükçe adım sayısının nasıl büyüdüğünü söyler.
  2. Tanıkları (witnesses) ikisini birden yaz: CC ve kk. Biri eksikse puan eksik.
  3. Sabit çarpanlar ve küçük terimler önemsiz. 5n2+100n5n^2 + 100n ile n2n^2 aynı sınıfta.
  4. “O değildir” ispatı her zaman çelişkiyle yapılır. Tanımı varsay, böl, sınırsız bir şeyin sabitten küçük olduğu sonucuna var.
  5. Döngü sayarken önce dış döngünün tek bir turunu düşün, sonra turları topla.

Big-O tanımı

ff ve gg fonksiyonlar olsun. f(x) is O(g(x)) demek şu demek:

∃ C,k    such that    ∣f(x)∣≤C ∣g(x)∣    whenever    x>k.\exists\, C, k \;\; \text{such that} \;\; |f(x)| \le C\,|g(x)| \;\; \text{whenever} \;\; x > k.

CC ve kk sabitlerine tanık (witness) denir. Sezgi: bir noktadan sonra (x>kx > k) ff‘nin grafiği, gg‘nin CC katının üstüne hiç çıkmaz. Başlangıçta ne yaptığı önemsiz.

Tanık çifti tek değildir. Bir çift çalışıyorsa daha büyük CC veya daha büyük kk da çalışır. Sınavda tek doğru çift istenmez, çalışan bir çift istenir.

GösterimOkunuşuAnlamıTanım
f=O(g)f = O(g)Big-Off en fazla gg kadar hızlı büyür∣f∣≤C∣g∣\lvert f\rvert \le C\lvert g\rvert, x>kx > k
f=Ω(g)f = \Omega(g)Big-Omegaff en az gg kadar hızlı büyür∣f∣≥C∣g∣\lvert f\rvert \ge C\lvert g\rvert, x>kx > k
f=Θ(g)f = \Theta(g)Big-Thetaff ile gg aynı hızda büyürC1∣g∣≤∣f∣≤C2∣g∣C_1\lvert g\rvert \le \lvert f\rvert \le C_2\lvert g\rvert

Θ\Theta = hem OO hem Ω\Omega. Bu yüzden Θ\Theta sorusunda iki ayrı eşitsizlik yazarsın.

Tanık bulma şablonu

Polinomlar için üç satırlık bir tarif var. Örnek: f(x)=4x2+7x+3f(x) = 4x^2 + 7x + 3 is O(x2)O(x^2).

When x > 1 we have x < x^2 and 1 < x^2.
Hence 4x^2 + 7x + 3 <= 4x^2 + 7x^2 + 3x^2 = 14x^2 for x > 1.
So f(x) is O(x^2) with witnesses C = 14 and k = 1.

Hile: x>1x > 1 iken küçük kuvvetleri en büyük kuvvete büyütmek serbest, çünkü ifadeyi büyütüyorsun ve eşitsizliğin yönü korunuyor. Sonra katsayıları topla: 4+7+3=144 + 7 + 3 = 14.

TUZAK · “for x > 1” cümlesi. Eşitsizliğin hangi xx‘ler için geçerli olduğunu yazmazsan kk‘yı söylememiş olursun. 0<x<10 < x < 1 aralığında x>x2x > x^2 olduğu için büyütme hilesi orada çalışmaz; k=1k = 1 tam olarak bu yüzden.

Theta: alt sınır bedava

f(n)=3n2+5n+2f(n) = 3n^2 + 5n + 2 is Θ(n2)\Theta(n^2):

  • Üst sınır: n>1n > 1 için 3n2+5n+2≤3n2+5n2+2n2=10n23n^2 + 5n + 2 \le 3n^2 + 5n^2 + 2n^2 = 10n^2, yani C2=10C_2 = 10.
  • Alt sınır: pozitif terimleri atınca ifade küçülür: 3n2+5n+2≥3n23n^2 + 5n + 2 \ge 3n^2, yani C1=3C_1 = 3.

Sonuç: n>1n > 1 için 3n2≤f(n)≤10n23n^2 \le f(n) \le 10n^2. Üç sabiti (C1=3C_1 = 3, C2=10C_2 = 10, k=1k = 1) birlikte yaz.

Negatif katsayı varsa (5n2−3n5n^2 - 3n gibi) alt sınır bedava değildir. O zaman 3n≤n23n \le n^2 gibi bir eşitsizlik kullanıp kk‘yı büyütürsün. Vizede genelde pozitif katsayılı polinom gelir.

“O değildir” ispatı (çelişki)

Bir fonksiyonun O(g)O(g) olmadığını göstermek için örnek yetmez; tanımın hiçbir C,kC, k ile sağlanamayacağını göstermen gerekir. Şablon çelişkidir. Örnek: n3n^3 is not O(7n2)O(7n^2).

Proof. Suppose, for contradiction, that n^3 is O(7n^2).
Then there are constants C and k with n^3 <= C * 7n^2 for all n > k.
Dividing both sides by n^2 > 0 gives n <= 7C for all n > k.
But this fails for any integer n > max(k, 7C).
This is a contradiction, so n^3 is not O(7n^2). ∎

Türkçesi: bölme işleminden sonra “sınırsız büyüyen nn, sabit 7C7C‘den hep küçük” gibi saçma bir sonuç çıkıyor. Hangi CC‘yi seçersen seç, n=7C+1n = 7C + 1 ve sonrası bunu bozar. Mesela C=50C = 50 için n=351n = 351: 3513>350⋅3512351^3 > 350 \cdot 351^2.

İPUCU · aynı şablon üstellerde. 4n4^n is not O(2n)O(2^n): 4n≤C⋅2n4^n \le C\cdot 2^n varsay, iki tarafı 2n2^n‘e böl, 2n≤C2^n \le C çıkar. 2n2^n sınırsız. Çelişki.

Büyüme sıralaması

Küçükten büyüğe, ezberlenecek zincir:

1  <  log⁡n  <  n  <  n  <  nlog⁡n  <  n2  <  n3  <  2n  <  3n  <  n!1 \;<\; \log n \;<\; \sqrt{n} \;<\; n \;<\; n\log n \;<\; n^2 \;<\; n^3 \;<\; 2^n \;<\; 3^n \;<\; n!

Kurallar:

  • Toplamda en hızlı büyüyen terim kazanır: n2+1000n+log⁡nn^2 + 1000n + \log n is O(n2)O(n^2).
  • Çarpımda sınırlar çarpılır: (n2+3)log⁡n(n^2 + 3)\log n is O(n2log⁡n)O(n^2 \log n).
  • Logaritmanın tabanı önemsiz: log⁡2n=(log⁡210)log⁡10n\log_2 n = (\log_2 10)\log_{10} n, sadece sabit çarpan.
  • Üsse sabit eklemek önemsiz, üssü çarpmak önemli: 2n+3=8⋅2n2^{n+3} = 8\cdot 2^n is O(2n)O(2^n); ama 22n=4n2^{2n} = 4^n değil.
  • Tabanı 1’den büyük her üstel, her polinomu sonunda geçer: (1.1)n(1.1)^n bile n100n^{100}‘ü geçer.

Algoritmaların karmaşıklığı

Zaman karmaşıklığı (time complexity): algoritmanın yaptığı temel işlem (karşılaştırma, toplama) sayısının girdi boyutu nn‘e göre ifadesi. Genelde en kötü durum (worst-case) sorulur: girdi ne kadar kötü olursa olsun en fazla kaç işlem.

AlgoritmaEn kötü durumNeden
Linear searchnn karşılaştırma, O(n)O(n)Aranan yoksa her elemana bakarsın
Binary searchyaklaşık log⁡2n\log_2 n tur, O(log⁡n)O(\log n)Her turda aralık yarıya iner
Bubble sort(n−1)n2\frac{(n-1)n}{2} karşılaştırma, Θ(n2)\Theta(n^2)(n−1)+(n−2)+⋯+1(n-1) + (n-2) + \dots + 1
İç içe iki tam döngün2n^2 işlemHer dış tur için nn iç tur

Örnekler: 50 elemanlı listede olmayan bir sayıyı linear search 50 karşılaştırmayla arar. 1024 elemanlı sıralı listede binary search (aralık 1 elemana inene kadar) 1024→512→⋯→11024 \to 512 \to \dots \to 1, yani 10 tur. 10 elemanlı ters sıralı listede bubble sort 9+8+⋯+1=459 + 8 + \dots + 1 = 45 karşılaştırma yapar.

Döngü sayma: adım adım

for i := 1 to n
    for j := i to n
        x := x + 1

Önce tek bir dış turu düşün: ii sabitken jj, ii‘den nn‘e gider, yani n−i+1n - i + 1 tur.

i = 1  ->  n tur
i = 2  ->  n - 1 tur
...
i = n  ->  1 tur
Toplam: n + (n-1) + ... + 1 = n(n+1)/2

n=8n = 8 için 8⋅92=36\frac{8 \cdot 9}{2} = 36. Big-O tahmini: n(n+1)2=12n2+12n≤n2\frac{n(n+1)}{2} = \frac{1}{2}n^2 + \frac{1}{2}n \le n^2 (n≥1n \ge 1), yani O(n2)O(n^2). Yarım n2n^2 bile olsa sınıf n2n^2.

Döngü değişkeni çarpılarak büyüyorsa (i:=2ii := 2i) tur sayısı logaritmiktir. Bölünerek küçülüyorsa (i:=⌊i/2⌋i := \lfloor i/2 \rfloor) yine logaritmik.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Sadece CC‘yi yazmakCC ve kk ikisi birden: “witnesses C = 14, k = 1”
“for x > 1” yazmamakEşitsizliğin geçerli olduğu aralık kk‘yı belirler, yaz
“Birkaç nn için denedim, f≤Cgf \le Cg değil”“O değildir” için tüm C,kC, k‘yı çürüten çelişki ispatı lazım
Θ\Theta için sadece üst sınırΘ\Theta = OO + Ω\Omega: iki eşitsizlik, C1C_1 ve C2C_2
4n4^n is O(2n)O(2^n)4n/2n=2n4^n / 2^n = 2^n sınırsız, değil
log⁡2n\log_2 n ile log⁡10n\log_{10} n farklı sınıfSabit çarpan kadar farklılar, aynı sınıf
n22\frac{n^2}{2} is O(n)O(n) çünkü “yarısı”Sabit çarpan sınıfı değiştirmez, O(n2)O(n^2)
İç döngü 1..i1..i ise nn tur1+2+⋯+n=n(n+1)21 + 2 + \dots + n = \frac{n(n+1)}{2} tur
Binary search O(n/2)O(n/2)Her tur yarıya böler, O(log⁡n)O(\log n)

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

Show that f(x)=2x2+9x+5f(x) = 2x^2 + 9x + 5 is O(x2)O(x^2). Give witnesses CC and kk.

Cevabı göster
C = 16, k = 1

x>1x > 1 iken x<x2x < x^2 ve 1<x21 < x^2. Her terimi x2x^2'ye büyüt: 2x2+9x+5≤2x2+9x2+5x2=16x22x^2 + 9x + 5 \le 2x^2 + 9x^2 + 5x^2 = 16x^2. Yani C=16C = 16, k=1k = 1. Başka doğru çiftler de var (örneğin C=3C = 3, kk büyük), ama bu şablon en hızlısı.

Soru 2kolay

Arrange the functions in increasing order of growth: nlog⁡nn\log n, n2n^2, 2n2^n, log⁡n\log n, n!n!, n\sqrt{n}.

Cevabı göster
log n, sqrt n, n log n, n^2, 2^n, n!

Logaritma her kuvvetten yavaştır, n=n1/2\sqrt{n} = n^{1/2} ise nn'den yavaştır. nlog⁡nn\log n, nn ile n2n^2 arasında. Her polinom her üstelden (2n2^n) yavaştır, n!n! ise 2n2^n'yi de geçer. Sıra: log⁡n<n<nlog⁡n<n2<2n<n!\log n < \sqrt{n} < n\log n < n^2 < 2^n < n!.

Soru 3orta

Give a big-O estimate for f(n)=(n3+2n)(log⁡n+4)+5n2f(n) = (n^3 + 2n)(\log n + 4) + 5n^2.

Cevabı göster
O(n^3 log n)

Çarpımda büyük terimler çarpılır: n3+2nn^3 + 2n için O(n3)O(n^3), log⁡n+4\log n + 4 için O(log⁡n)O(\log n), çarpım O(n3log⁡n)O(n^3 \log n). Toplamda en hızlı büyüyen kazanır: 5n25n^2, n3log⁡nn^3\log n'nin yanında küçük kalır. Sonuç O(n3log⁡n)O(n^3 \log n).

Soru 4orta

(a) Is 3n+23^{n+2} O(3n)O(3^n)? (b) Is 9n9^n O(3n)O(3^n)?

Cevabı göster
(a) yes, C = 9; (b) no

(a) 3n+2=9⋅3n3^{n+2} = 9 \cdot 3^n, yani C=9C = 9, k=0k = 0 ile O(3n)O(3^n). Üsse sabit eklemek sabit çarpan demektir.
(b) 9n=32n=3n⋅3n9^n = 3^{2n} = 3^n \cdot 3^n. 9n≤C⋅3n9^n \le C\cdot 3^n olsaydı iki tarafı 3n3^n'e bölünce 3n≤C3^n \le C olurdu; 3n3^n sınırsız büyüdüğü için bu bir yerde bozulur. O değildir.

Soru 5orta

How many times is x := x + 1 executed? Give the count for n=6n = 6, the general formula, and a Big-Theta estimate.

for i := 1 to n
    for j := 1 to 2n
        x := x + 1
Cevabı göster
72; 2n^2; Theta(n^2)

Dış döngü nn tur, her turda iç döngü 2n2n tur. Toplam n⋅2n=2n2n \cdot 2n = 2n^2. n=6n = 6 için 2⋅36=722\cdot 36 = 72. Sabit çarpan 2 önemsiz: Θ(n2)\Theta(n^2).

Soru 6orta

Show that f(n)=4n2+6n+1f(n) = 4n^2 + 6n + 1 is Θ(n2)\Theta(n^2). Give C1C_1, C2C_2 and kk.

Cevabı göster
C1 = 4, C2 = 11, k = 1

Üst sınır: n>1n > 1 için 4n2+6n+1≤4n2+6n2+n2=11n24n^2 + 6n + 1 \le 4n^2 + 6n^2 + n^2 = 11n^2. Alt sınır: pozitif terimleri atınca ifade küçülür, 4n2+6n+1≥4n24n^2 + 6n + 1 \ge 4n^2. Böylece n>1n > 1 için 4n2≤f(n)≤11n24n^2 \le f(n) \le 11n^2, yani Θ(n2)\Theta(n^2).

Soru 7zor

Prove that n2n^2 is not O(10n)O(10n).

Cevabı göster
Assume n^2 <= C(10n) for n > k; then n <= 10C, false for n > max(k, 10C).

Çelişki şablonu. Varsay: n>kn > k olan her nn için n2≤C⋅10nn^2 \le C \cdot 10n olacak şekilde C,kC, k var. İki tarafı n>0n > 0'a böl: n≤10Cn \le 10C. Ama n>max⁡(k,10C)n > \max(k, 10C) seçersen bu bozulur (örneğin C=3C = 3 için n=31n = 31: 961>930961 > 930). Çelişki, yani n2n^2, O(10n)O(10n) değildir.

Soru 8kolay

Bubble sort is run on a list of 12 numbers in decreasing order. How many comparisons does it make?

Cevabı göster
66

Bubble sort'un karşılaştırma sayısı girdiden bağımsızdır (erken çıkışsız sürüm): 1. geçişte 11, 2. geçişte 10, ..., son geçişte 1. Toplam (n−1)n2=11⋅122=66\frac{(n-1)n}{2} = \frac{11 \cdot 12}{2} = 66.

Soru 9orta

The binary search below runs on a sorted list a1,…,a64a_1, \dots, a_{64}. How many times does the while loop execute, whatever xx is?

i := 1; j := 64
while i < j
    m := floor((i + j) / 2)
    if x > a_m then i := m + 1
    else j := m
Cevabı göster
6

Her turda aralık tam yarıya iner: 64 → 32 → 16 → 8 → 4 → 2 → 1. Altı yarılama, yani 6 tur. Genel olarak n=2kn = 2^k için k=log⁡2nk = \log_2 n tur, O(log⁡n)O(\log n).

Soru 10zor

How many times does the loop body execute for n=100n = 100? Give a big-O estimate.

i := 1
while i <= n
    i := 2 * i
Cevabı göster
7; O(log n)

ii değerleri: 1, 2, 4, 8, 16, 32, 64 (hepsi ≤100\le 100). Sonraki 128 > 100, döngü biter. 7 tur. Genel formül ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1, yani O(log⁡n)O(\log n).

Soru 11orta

Is log⁡2n\log_2 n Θ(log⁡10n)\Theta(\log_{10} n)? Justify.

Cevabı göster
Yes

Taban değiştirme: log⁡2n=log⁡10nlog⁡102=(log⁡210)⋅log⁡10n≈3.32log⁡10n\log_2 n = \frac{\log_{10} n}{\log_{10} 2} = (\log_2 10)\cdot \log_{10} n \approx 3.32 \log_{10} n. Aralarında sabit çarpan var, bu yüzden Big-O dünyasında logaritmanın tabanı önemsizdir: Θ\Theta.

Soru 12zor

How many times is s := s + 1 executed when n=5n = 5? Give a big-O estimate.

for i := 1 to n
    for j := 1 to i
        for k := 1 to j
            s := s + 1
Cevabı göster
35; O(n^3)

Sabit ii ve jj için en içteki döngü jj kez döner. Sabit ii için toplam 1+2+⋯+i=i(i+1)21 + 2 + \dots + i = \frac{i(i+1)}{2}. Bunları i=1..5i = 1..5 için topla: 1+3+6+10+15=351 + 3 + 6 + 10 + 15 = 35. Genel formül n(n+1)(n+2)6\frac{n(n+1)(n+2)}{6}, yani O(n3)O(n^3).

Doğrulama: Tanık eşitsizlikleri x > k için yoğun sayısal taramayla, döngü sayıları ve arama/sıralama karşılaştırmaları kodu çalıştırıp sayarak, büyüme sıralaması logaritmik karşılaştırmayla node'da doğrulandı (verify/MAT2033/06.mjs).

Deftere not kartı

f is O(g): |f(x)| <= C|g(x)| for all x > k (C, k = witnesses, IKISINI DE YAZ) Omega: >= C|g| Theta: C1|g| <= |f| <= C2|g| (O ve Omega birden) Polinom sablonu: x > 1 icin her terimi en buyuk kuvvete buyut, katsayilari topla = C, k = 1 Alt sinir: pozitif terimleri at -> bas katsayi = C1 "O degildir": varsay n^a <= C n^b, bol, n <= C gibi sacmalik, n > max(k, C) ile celiski Sira: 1 < log n < sqrt n < n < n log n < n^2 < n^3 < 2^n < 3^n < n! Toplam -> en buyuk terim; carpim -> carp: (n^2+1)log n = O(n^2 log n) 2^(n+1) = 2*2^n -> O(2^n) ama 4^n = 2^(2n) O(2^n) DEGIL log tabani onemsiz: log2 n = Theta(log10 n) Ic ice 1..n, 1..n -> n^2 ic dongu 1..i -> n(n+1)/2 -> Theta(n^2) i := 2i dongusu -> floor(log2 n)+1 tur -> O(log n) Linear search en kotu n karsilastirma O(n); binary search O(log n) Bubble sort (n-1)n/2 karsilastirma -> Theta(n^2)