TDT4120 Algoritmer og datastrukturer Interaktivt kompendium · H2026
Fremgang
0/15

Formelsamling

Til eksamen i dette emnet deles det ikke ut noen formelsamling. Oversikten under er en studieressurs: på eksamen må alt kunnes uten hjelpemidler.

01 Asymptotisk notasjon

  • O(na)+Ω(nb)+Θ(nc)=Ω(nb+nc)\displaystyle O(n^a) + \Omega(n^b) + \Theta(n^c) = \Omega(n^b + n^c) Summer øvre og nedre grenser hver for seg. Står bare en nedre grense igjen, skrives den med Ω\Omega.

02 Insertion-Sort

  • ∑k=1n−1k=n(n−1)2=Θ(n2)\displaystyle \sum_{k=1}^{n-1} k = \dfrac{n(n-1)}{2} = \Theta(n^2) Trekanttall, og antall forskyvninger i verste tilfelle for Insertion-Sort

03 Tabelldobling

  • ∑i=0h−12i=2h−1\displaystyle \sum_{i=0}^{h-1} 2^i = 2^h - 1 Toerpotens-summen: 1+2+4+⋯+n/2=n−11 + 2 + 4 + \cdots + n/2 = n - 1 når n=2hn = 2^h. Det totale kopieringsarbeidet i tabelldobling.

04 Splitt og hersk

  • alog⁡bn=nlog⁡ba\displaystyle a^{\log_b n} = n^{\log_b a} Antall løvnoder i rekursjonstreet til T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n), skrevet som en potens av nn. Ta logaritmen på begge sider: log⁡bn⋅log⁡a=log⁡ba⋅log⁡n\log_b n \cdot \log a = \log_b a \cdot \log n.
  • T(n)=T(n/2)+1=lg⁡n+1=Θ(lg⁡n)\displaystyle T(n) = T(n/2) + 1 = \lg n + 1 = \Theta(\lg n) Binærsøk: ett kall på halve instansen pluss konstant arbeid. Argumentet halveres per ekspansjon, så det trengs lg⁡n\lg n ekspansjoner.
  • T(n)=2T(n/2)+n=nlg⁡n+n=Θ(nlg⁡n)\displaystyle T(n) = 2T(n/2) + n = n \lg n + n = \Theta(n \lg n) Merge-Sort: rekursjonstreet har lg⁡n+1\lg n + 1 nivåer som hvert koster nn.
  • T(n)=T(n−1)+n=n(n+1)2=Θ(n2)\displaystyle T(n) = T(n-1) + n = \dfrac{n(n+1)}{2} = \Theta(n^2) Quicksort i verste tilfelle: pivoten står alene på hvert nivå, og nivåkostnadene n,n−1,…,1n, n-1, \ldots, 1 summerer til trekanttallet.
  • T(n)=aT(n/b)+f(n)  ⟹  T(n)={Θ(nlog⁡ba)f(n)=O(nlog⁡ba−ϵ)Θ(nlog⁡balg⁡k+1n)f(n)=Θ(nlog⁡balg⁡kn), k≥0Θ(f(n))f(n)=Ω(nlog⁡ba+ϵ)\displaystyle T(n) = aT(n/b) + f(n) \implies T(n) = \begin{cases} \Theta(n^{\log_b a}) & f(n) = O(n^{\log_b a - \epsilon}) \\ \Theta(n^{\log_b a} \lg^{k+1} n) & f(n) = \Theta(n^{\log_b a} \lg^{k} n),\ k \ge 0 \\ \Theta(f(n)) & f(n) = \Omega(n^{\log_b a + \epsilon}) \end{cases} Masterteoremet. Sammenlign f(n)f(n) med vannskillefunksjonen nlog⁡ban^{\log_b a}; avstanden må være en faktor nϵn^\epsilon i tilfelle 1 og 3, og tilfelle 3 krever i tillegg af(n/b)≤cf(n)a f(n/b) \le c f(n) for en c<1c < 1.

05 Rangering i lineær tid

  • n!>(n/e)n  ⟹  lg⁡n!>nlg⁡n−nlg⁡e=Ω(nlg⁡n)\displaystyle n! > (n/e)^n \implies \lg n! > n \lg n - n \lg e = \Omega(n \lg n) Sorteringsgrensen. Et beslutningstre med n!n! løvnoder har høyde minst lg⁡n!\lg n!, og Stirlings formel gir n!>(n/e)nn! > (n/e)^n. Enhver sammenligningsbasert sortering bruker Ω(nlg⁡n)\Omega(n \lg n) sammenligninger i verste tilfelle.
  • T(n)=T(n/2)+n=2n−1=Θ(n)\displaystyle T(n) = T(n/2) + n = 2n - 1 = \Theta(n) Randomized-Select når pivoten deler på midten: ett kall på halve instansen pluss lineært arbeid, en geometrisk sum n+n/2+⋯+1n + n/2 + \cdots + 1. Forventet kjøretid er Θ(n)\Theta(n) for enhver input; verste tilfelle er Θ(n2)\Theta(n^2).
  • T(n)≤T(n/5)+T(7n/10)+Θ(n)=Θ(n)\displaystyle T(n) \le T(n/5) + T(7n/10) + \Theta(n) = \Theta(n) Select. Medianen av gruppemedianene garanterer at minst 3n/103n/10 elementer ligger på hver side av pivoten, så det rekursive kallet får høyst 7n/107n/10. Kallene får til sammen 9n/10<n9n/10 < n, og rota dominerer.
  • T(n)=Θ(n+k)\displaystyle T(n) = \Theta(n + k) Counting-Sort på nn heltall i området 0..k0 .. k: to løkker over AA og én over CC. Lineær når k=O(n)k = O(n).
  • T(n)=Θ(d(n+k))\displaystyle T(n) = \Theta(d(n + k)) Radix-Sort: dd siffer, hvert med k+1k + 1 mulige verdier, sortert stabilt ett siffer om gangen med Counting-Sort.

06 Rotfaste trestrukturer

  • Left(i)=2iRight(i)=2i+1Parent(i)=⌊i/2⌋\displaystyle \begin{aligned} \text{Left}(i) &= 2i \\ \text{Right}(i) &= 2i + 1 \\ \text{Parent}(i) &= \lfloor i/2 \rfloor \end{aligned} Haugen som tabell, nummerert nivå for nivå med rota som 1. Med indekser fra 0 blir barna 2i+12i + 1 og 2i+22i + 2 og forelderen ⌊(i−1)/2⌋\lfloor (i - 1)/2 \rfloor.
  • 2h≤n≤2h+1−1\displaystyle 2^h \le n \le 2^{h+1} - 1 Antall elementer i en haug med høyde hh: nivåene over det nederste er fulle, og det nederste har fra 1 til 2h2^h noder. Altså er h=⌊lg⁡n⌋h = \lfloor \lg n \rfloor.
  • ∑k=0⌊lg⁡n⌋⌈n2k+1⌉O(k)=O(n)\displaystyle \sum_{k=0}^{\lfloor \lg n \rfloor} \left\lceil \dfrac{n}{2^{k+1}} \right\rceil O(k) = O(n) Build-Max-Heap. Høyst ⌈n/2k+1⌉\lceil n/2^{k+1} \rceil noder har høyde kk, og hver av dem synker høyst kk steg. Summen er O(n∑k≥0k/2k)=O(2n)O(n \sum_{k \ge 0} k/2^k) = O(2n), for ∑k≥0kxk=x/(1−x)2\sum_{k \ge 0} k x^k = x/(1-x)^2. Ikke det samme som nn innsettinger, som koster Θ(nlg⁡n)\Theta(n \lg n).
  • T(n)=Θ(n)+(n−1)⋅O(lg⁡n)=O(nlg⁡n)\displaystyle \begin{aligned} T(n) &= \Theta(n) + (n - 1) \cdot O(\lg n) \\ &= O(n \lg n) \end{aligned} Heapsort: bygg haugen i lineær tid, og ta ut maksimum n−1n - 1 ganger med Max-Heapify på O(lg⁡n)O(\lg n) hver. Θ(nlg⁡n)\Theta(n \lg n) i verste tilfelle og Θ(n)\Theta(n) i beste, når alle elementene er like.

07 Dynamisk programmering

  • r0=0rn=max⁡1≤i≤n(pi+rn−i)\displaystyle r_0 = 0 \allowbreak\quad r_n = \max_{1 \le i \le n} (p_i + r_{n-i}) Stavkapping: prøv alle lengder ii på den første biten, og kapp resten optimalt. Med memoisering eller nedenfra og opp er det Θ(n2)\Theta(n^2).
  • T(n)=1+∑j=0n−1T(j)=2n\displaystyle T(n) = 1 + \sum_{j=0}^{n-1} T(j) = 2^n Antall kall Cut-Rod gjør uten lagring, rota medregnet. Trekk T(n−1)T(n-1) fra T(n)T(n): da er T(n)=2T(n−1)T(n) = 2T(n-1), og T(0)=1T(0) = 1.
  • c[i,j]={0i=0 eller j=0c[i−1,j−1]+1i,j>0 og xi=yjmax⁡(c[i−1,j], c[i,j−1])i,j>0 og xi≠yj\displaystyle c[i, j] = \begin{cases} 0 & i = 0 \text{ eller } j = 0 \\ c[i-1, j-1] + 1 & i, j > 0 \text{ og } x_i = y_j \\ \max(c[i-1, j],\, c[i, j-1]) & i, j > 0 \text{ og } x_i \ne y_j \end{cases} Lengden av en LCS av prefiksene XiX_i og YjY_j. Tabellen fylles rad for rad i Θ(mn)\Theta(mn).
  • K[i,j]={0i=0K[i−1,j]wi>jmax⁡(K[i−1,j], K[i−1,j−wi]+vi)wi≤j\displaystyle K[i, j] = \begin{cases} 0 & i = 0 \\ K[i-1, j] & w_i > j \\ \max(K[i-1, j],\, K[i-1, j - w_i] + v_i) & w_i \le j \end{cases} Det binære ryggsekkproblemet med gjenstandene 1,…,i1, \ldots, i og kapasitet jj. Tabellen har (n+1)(W+1)(n+1)(W+1) celler, så kjøretiden er Θ(nW)\Theta(nW).
  • Θ(nW)=Θ(n2m)m=⌊lg⁡W⌋+1\displaystyle \Theta(nW) = \Theta(n 2^m) \allowbreak\quad m = \lfloor \lg W \rfloor + 1 Kjøretiden for ryggsekkproblemet uttrykt ved antall bits mm i WW. Den er polynomisk i tallet WW, men eksponentiell i inputstørrelsen, altså pseudopolynomisk.

08 Grådighet

  • B(T)=∑c∈Cc.freq⋅dT(c)\displaystyle B(T) = \sum_{c \in C} c.\mathit{freq} \cdot d_T(c) Kostnaden til kodetreet TT: antall bits i den kodede teksten. Dybden dT(c)d_T(c) er lengden av kodeordet til cc. For et huffmantre er det også summen av frekvensene i de indre nodene.
  • B(T)=B(T′)+x.freq+y.freq\displaystyle B(T) = B(T') \allowbreak + x.\mathit{freq} + y.\mathit{freq} Optimal delstruktur for Huffman: T′T' har det nye tegnet zz i stedet for xx og yy. Får zz barna xx og yy, blir kodeordene deres én bit lengre.

09 Traversering av grafer

  • ∑u∈V∣G.Adj[u]∣=∣E∣\displaystyle \sum_{u \in V} |G.\mathit{Adj}[u]| = |E| Nabolistene i en rettet graf: kanten (u,v)(u, v) står bare i lista til uu. I en urettet graf står den i begge listene, og summen er 2∣E∣2|E|. Nabolistene tar Θ(V+E)\Theta(V + E) plass, og en nabomatrise tar Θ(V2)\Theta(V^2).
  • Θ(V)+∑u∈VΘ(1+∣G.Adj[u]∣)=Θ(V+E)\displaystyle \Theta(V) + \sum_{u \in V} \Theta(1 + |G.\mathit{Adj}[u]|) \allowbreak = \Theta(V + E) DFS: initialiseringen, og ett kall til DFS-Visit per node, som går gjennom nabolista én gang. BFS bruker O(V+E)O(V + E) med samme argument. Topological-Sort og Strongly-Connected-Components bruker også Θ(V+E)\Theta(V + E).
  • u.d<v.d<v.f<u.f\displaystyle u.d < v.d < v.f < u.f Parentesteoremet: vv er en ekte etterkommer av uu i dybde-først-skogen hvis og bare hvis intervallet til vv ligger inni intervallet til uu. Ellers er intervallene disjunkte, eller uu er en etterkommer av vv.
  • (u,v)∈E  ⇒  v.f<u.f\displaystyle (u, v) \in E \;\Rightarrow\; v.f < u.f I en DAG går hver kant fra en node med høyere sluttid til en med lavere. Derfor gir synkende sluttid en topologisk sortering.
  • v.d=δ(s,v)\displaystyle v.d = \delta(s, v) Etter BFS fra ss er v.dv.d det minste antallet kanter på en sti fra ss til vv, og ∞\infty hvis vv ikke kan nås. Stien i bredde-først-treet fra ss til vv er en korteste vei.