🌴 Algoritmejungelen 🌴

Utforsk jungelen og samle alle artifaktene!

🐒
Kjennskap til 0 / 105
🦧
Forstår og kan bruke 0 / 105
🐒 Kjennskap:
🫘
🌱
🌿
🌴
🌳
🦧 Forståelse:
🍌
🐒
🦍
🦧
👑
🗺️

Forelesning 1: Problemer og algoritmer

0/8 0/8
  • Forstå bokas pseudokode-konvensjoner
  • Kjenne egenskapene til random-access machine-modellen (RAM)
  • Kunne definere problem, instans og problemstørrelse
  • Kunne definere asymptotisk notasjon: O, Ω, Θ, o og ω
  • Kunne definere best-case, average-case og worst-case
  • Forstå løkkeinvarianter og induksjon
  • Forstå rekursiv dekomponering og induksjon over delproblemer
  • Forstå INSERTION-SORT
📦

Forelesning 2: Datastrukturer

0/9 0/9
  • Forstå hvordan stakker og køer fungerer (STACK-EMPTY, PUSH, POP, ENQUEUE, DEQUEUE)
  • Forstå hvordan lenkede lister fungerer (LIST-SEARCH, LIST-INSERT, LIST-DELETE)
  • Forstå hvordan pekere og objekter kan implementeres
  • Forstå hvordan direkte adressering og hashtabeller fungerer (HASH-INSERT, HASH-SEARCH)
  • Forstå konfliktløsing ved kjeding (chaining)
  • Kjenne til grunnleggende hashfunksjoner
  • Vite at man for statiske datasett kan ha worst-case O(1) for søk
  • Kunne definere amortisert analyse
  • Forstå hvordan dynamiske tabeller fungerer (TABLE-INSERT)
⚔️

Forelesning 3: Splitt og hersk

0/8 0/8
  • Forstå designmetoden divide-and-conquer (splitt og hersk)
  • Forstå maximum-subarray-problemet med løsninger
  • Forstå BISECT og BISECT'
  • Forstå MERGE-SORT
  • Forstå QUICKSORT og RANDOMIZED-QUICKSORT
  • Kunne løse rekurrenser med substitusjon, rekursjonstrær og masterteoremet
  • Kunne løse rekurrenser med iterasjonsmetoden
  • Forstå hvordan variabelskifte fungerer
🏃

Forelesning 4: Rangering i lineær tid

0/7 0/7
  • Forstå hvorfor sammenligningsbasert sortering har en worst-case på Ω(n lg n)
  • Vite hva en stabil sorteringsalgoritme er
  • Forstå COUNTING-SORT, og hvorfor den er stabil
  • Forstå RADIX-SORT, og hvorfor den trenger en stabil subrutine
  • Forstå BUCKET-SORT
  • Forstå RANDOMIZED-SELECT
  • Kjenne til SELECT
🌳

Forelesning 5: Rotfaste trestrukturer

0/6 0/6
  • Forstå hvordan heaps fungerer, og hvordan de kan brukes som prioritetskøer
  • Forstå HEAPSORT
  • Forstå hvordan rotfaste trær kan implementeres
  • Forstå hvordan binære søketrær fungerer (INORDER-TREE-WALK, TREE-SEARCH, etc.)
  • Vite at forventet høyde for et tilfeldig binært søketre er Θ(lg n)
  • Vite at det finnes søketrær med garantert høyde på Θ(lg n)
🧩

Forelesning 6: Dynamisk programmering

0/9 0/9
  • Forstå ideen om en delproblemgraf
  • Forstå designmetoden dynamisk programmering
  • Forstå løsning ved memoisering (top-down)
  • Forstå løsning ved iterasjon (bottom-up)
  • Forstå hvordan man rekonstruerer en løsning fra lagrede beslutninger
  • Forstå hva optimal delstruktur er
  • Forstå hva overlappende delproblemer er
  • Forstå eksemplene stavkutting og LCS
  • Forstå løsningen på 0-1-ryggsekkproblemet (KNAPSACK)
🤑

Forelesning 7: Grådige algoritmer

0/4 0/4
  • Forstå designmetoden grådighet
  • Forstå grådighetsegenskapen (the greedy-choice property)
  • Forstå eksemplene aktivitet-utvelgelse og det fraksjonelle ryggsekkproblemet
  • Forstå HUFFMAN og Huffman-koder
🕸️

Forelesning 8: Traversering av grafer

0/8 0/8
  • Forstå hvordan grafer kan implementeres
  • Forstå BFS, også for å finne korteste vei uten vekter
  • Forstå DFS og parentesteoremet
  • Forstå hvordan DFS klassifiserer kanter
  • Forstå TOPOLOGICAL-SORT
  • Forstå hvordan DFS kan implementeres med en stakk
  • Forstå hva traverseringstrær er (bredde-først- og dybde-først-trær)
  • Forstå traversering med vilkårlig prioritetskø
🌲

Forelesning 9: Minimale spenntrær

0/6 0/6
  • Forstå skog-implementasjon av disjunkte mengder (MAKE-SET, UNION, FIND-SET)
  • Vite hva spenntrær og minimale spenntrær er
  • Forstå GENERIC-MST
  • Forstå hvorfor lette kanter er trygge kanter
  • Forstå MST-KRUSKAL
  • Forstå MST-PRIM
🛤️

Forelesning 10: Korteste vei fra én til alle

0/11 0/11
  • Forstå ulike varianter av korteste-vei-problemet (single-source, single-pair, all-pairs)
  • Forstå strukturen til korteste-vei-problemet
  • Forstå at negative sykler gir mening for korteste enkle vei
  • Forstå at korteste enkle vei kan løses vha. lengste enkle vei og omvendt
  • Forstå hvordan man kan representere et korteste-vei-tre
  • Forstå kant-slakking (edge relaxation) og RELAX
  • Forstå egenskaper ved korteste veier og slakking
  • Forstå BELLMAN-FORD
  • Forstå DAG-SHORTEST-PATH
  • Forstå kobling mellom DAG-SHORTEST-PATH og dynamisk programmering
  • Forstå DIJKSTRA
🗺️

Forelesning 11: Korteste vei fra alle til alle

0/4 0/4
  • Forstå forgjengerstrukturen for alle-til-alle varianten (PRINT-ALL-PAIRS-SHORTEST-PATH)
  • Forstå FLOYD-WARSHALL
  • Forstå TRANSITIVE-CLOSURE
  • Forstå JOHNSON
🌊

Forelesning 12: Maksimal flyt

0/11 0/11
  • Kunne definere flytnettverk, flyt og maks-flyt-problemet
  • Kunne håndtere antiparallelle kanter og flere kilder og sluk
  • Kunne definere residualnettverket til et nettverk med en gitt flyt
  • Forstå hvordan man kan oppheve (cancel) flyt
  • Forstå hva en forøkende sti (augmenting path) er
  • Forstå hva snitt, snitt-kapasitet og minimalt snitt er
  • Forstå maks-flyt/min-snitt teoremet
  • Forstå FORD-FULKERSON-METHOD og FORD-FULKERSON
  • Vite at FORD-FULKERSON med BFS kalles Edmonds-Karp-algoritmen
  • Forstå hvordan maks-flyt kan finne en maksimum bipartitt matching
  • Forstå heltallsteoremet (integrality theorem)
🔮

Forelesning 13: NP-kompletthet

0/14 0/14
  • Forstå sammenhengen mellom optimerings- og beslutningsproblemer
  • Forstå koding (encoding) av en instans
  • Forstå hvorfor løsningen vår på 0-1-ryggsekkproblemet ikke er polynomisk
  • Forstå forskjellen på konkrete og abstrakte problemer
  • Forstå representasjonen av beslutningsproblemer som formelle språk
  • Forstå definisjonen av klassene P, NP og co-NP
  • Forstå redusibilitets-relasjonen ≤p
  • Forstå definisjonen av NP-hardhet og NP-kompletthet
  • Forstå den konvensjonelle hypotesen om forholdet mellom P, NP og NPC
  • Forstå hvordan NP-kompletthet kan bevises ved én reduksjon
  • Kjenne de NP-komplette problemene CIRCUIT-SAT, SAT, 3-CNF-SAT, CLIQUE, VERTEX-COVER, HAM-CYCLE, TSP og SUBSET-SUM
  • Forstå at 0-1-ryggsekkproblemet er NP-hardt
  • Forstå at lengste enkle-vei-problemet er NP-hardt
  • Være i stand til å konstruere enkle NP-kompletthetsbevis

📖 Fortellingen om Algoritmejungelen

Du står ved kanten av en tett, mystisk jungel. Inne blant trærne skjuler det seg hemmeligheter som har tatt menneskeheten århundrer å oppdage. Algoritmer. Datastrukturer. Løsninger på problemer du ikke visste fantes. Foran deg ligger en reise som vil forandre måten du tenker på for alltid...

🗺️ Kapittel 1: Problemer og Algoritmer – Jungelens Språk

Før du tar et eneste steg inn i jungelen, må du lære å se verden slik en datamaskin ser den. Hva er egentlig et problem? Det er en spørsmålstype – som "finn den korteste veien" eller "sorter disse tallene". En instans er et konkret eksempel – "finn korteste vei fra A til B i dette kartet".

Men her kommer det viktige: Hvor vanskelig er problemet? Ikke i absolutte termer, men i forhold til størrelsen. Hvis du dobler antall elementer, dobles tiden? Kvadreres den? Eksploderer den? Dette er asymptotisk analyse – kunsten å forstå hvordan ting vokser.

Du lærer notasjonene: O(n) betyr "vokser lineært", O(n²) betyr "vokser kvadratisk", O(log n) betyr "vokser utrolig sakte". Disse symbolene blir ditt kompass i jungelen – de forteller deg hva som er mulig og hva som er håpløst.

Og så møter du din første algoritme: Insertion Sort. Enkel, intuitiv, som å sortere kort på hånden. Ikke den raskeste, men den lærer deg å tenke i løkker og invarianter – påstander som alltid er sanne gjennom algoritmen.

📦 Kapittel 2: Datastrukturer – Verktøykassen

En håndverker er bare så god som verktøyene sine. I algoritmejungelen er datastrukturer verktøyene dine – måtene du organiserer informasjon på.

Stakker er som en stabel med tallerkener: sist inn, først ut (LIFO). Køer er som køen på butikken: først inn, først ut (FIFO). Enkelt, men fundamentalt – disse dukker opp overalt.

Lenkede lister lar deg sette inn og slette elementer lynraskt, men du må lete gjennom hele listen for å finne noe. Hashtabeller er magiske: de lar deg slå opp hva som helst på (nesten) konstant tid, O(1). Hemmeligheten? En smart hashfunksjon som sprer dataene jevnt utover.

Du lærer også om amortisert analyse – ideen om at selv om én operasjon av og til er dyr, er gjennomsnittet billig. Som å spare penger: du betaler litt ekstra noen ganger, men over tid jevner det seg ut.

⚔️ Kapittel 3: Splitt og Hersk – Den Første Kampstrategien

Her lærer du den første virkelig kraftige teknikken: Divide and Conquer. Ideen er enkel men genial: Ta et stort problem, del det i mindre biter, løs bitene rekursivt, og kombiner svarene.

MergeSort er det perfekte eksempelet: Del listen i to, sorter hver halvdel, og flett dem sammen. Alltid O(n log n), garantert. QuickSort er den ville fetteren – raskere i praksis, men med en svakhet for dårlige pivotvalg. Derfor randomiserer vi!

Men hvordan vet vi at disse er raske? Her kommer rekurrensligninger inn. T(n) = 2T(n/2) + n – hva betyr det? Du lærer å løse dem med masterteoremet, substitusjon og rekursjonstrær. Plutselig kan du bevise at algoritmene dine faktisk fungerer.

🏃 Kapittel 4: Rangering i Lineær Tid – Å Bryte Barrieren

"Ingen sammenligningsbasert sortering kan være raskere enn O(n log n)." Dette er et teorem, ikke en begrensning – du kan faktisk bevise det med beslutningstrær!

Men vent – hva om vi ikke sammenligner? Counting Sort teller hvor mange av hvert element som finnes. Radix Sort sorterer siffer for siffer. Bucket Sort fordeler elementer i bøtter. Alle disse kan slå O(n log n) – men bare under spesielle forhold.

Du lærer også om stabilitet – at like elementer beholder sin relative rekkefølge. Det høres trivielt ut, men det er kritisk når Radix Sort bruker Counting Sort som subrutine.

🌳 Kapittel 5: Rotfaste Trestrukturer – Naturens Egen Design

Trær er overalt i algoritmeverdenen, og nå forstår du hvorfor. En heap er et nesten-komplett binært tre der hver forelder er større (eller mindre) enn barna sine. Dette gir deg en prioritetskø: du kan alltid finne det største elementet på O(1), og legge til eller fjerne på O(log n).

HeapSort bruker dette til å sortere: bygg en heap, og plukk ut det største elementet om og om igjen. Elegant og in-place!

Binære søketrær lar deg søke, sette inn og slette – alt på O(log n), hvis treet er balansert. Men pass på: et ubalansert tre kan degenerere til en lenket liste! Derfor finnes det selvbalanserende trær som garanterer O(log n) høyde.

🧩 Kapittel 6: Dynamisk Programmering – Hukommelsens Kunst

Dette er kanskje det viktigste kapitlet. Dynamisk programmering (DP) er teknikken for å løse problemer som har overlappende delproblemer og optimal delstruktur.

Hva betyr det? Overlappende delproblemer betyr at du løser de samme små problemene om og om igjen. Optimal delstruktur betyr at den beste løsningen på det store problemet kan bygges fra de beste løsningene på de små.

To tilnærminger: Top-down med memoisering – skriv rekursivt, men husk svarene. Bottom-up med iterasjon – bygg opp fra de minste delproblemene. Begge gir samme svar, men bottom-up bruker ofte mindre minne.

Klassikerne: Stavkutting (hvordan kutte en stav for maksimal profitt), LCS (lengste felles delsekvens), og 0-1 Knapsack (hvordan pakke ryggsekken optimalt). Mestre disse, og du kan løse hundrevis av lignende problemer.

🤑 Kapittel 7: Grådige Algoritmer – Enkel Genialitet

Noen ganger er det beste svaret også det enkleste: ta det beste valget akkurat nå, og aldri se tilbake. Dette er grådighet.

Men advarsel: grådighet fungerer ikke alltid! Du må bevise at problemet har grådighetsegenskapen – at lokalt optimale valg fører til globalt optimale løsninger.

Aktivitetsutvelgelse er det klassiske eksempelet: velg alltid aktiviteten som slutter først. Huffman-koding komprimerer data ved å gi korte koder til vanlige symboler. Begge er grådige, begge er optimale – men du må kunne bevise hvorfor.

🕸️ Kapittel 8: Traversering av Grafer – Utforskerens Verktøy

Velkommen til grafriket! En graf er bare noder og kanter – men den kan representere alt: veier, nettverk, vennskap, avhengigheter, tilstander.

BFS (Breadth-First Search) utforsker lag for lag, som ringer i vannet. Den finner korteste vei i uveide grafer. DFS (Depth-First Search) går så dypt som mulig før den snur – perfekt for å utforske alt.

DFS klassifiserer kanter: tre-kanter (del av søketreet), tilbake-kanter (sykler!), foroverkanter og kryss-kanter. Du lærer parentesteoremet – hvordan start- og sluttider avslører strukturen i grafen.

Topologisk sortering ordner nodene i en DAG (rettet asyklisk graf) slik at alle kanter peker "fremover". Perfekt for å finne rekkefølgen du må gjøre ting i.

🌲 Kapittel 9: Minimale Spenntrær – Å Koble Alt Sammen

Gitt et nettverk med kostnader på kantene: hva er den billigste måten å koble alle nodene sammen? Dette er et minimalt spenntre.

Kruskals algoritme er grådig: sorter kantene etter vekt, og legg til den letteste kanten som ikke lager en sykel. Prims algoritme vokser treet fra én node: legg alltid til den billigste kanten ut av det nåværende treet.

Begge bruker konseptet trygge kanter – kanter du trygt kan legge til uten å ødelegge optimaliteten. Og begge trenger Union-Find for å effektivt holde styr på hvilke noder som er koblet sammen.

🛤️ Kapittel 10: Korteste Vei fra Én til Alle

Nå blir det virkelig interessant. Gitt en startnode: hva er korteste vei til alle andre noder?

Dijkstras algoritme er dronningen: alltid prosesser noden med kortest kjent avstand, og oppdater naboene. Fungerer perfekt – men bare med ikke-negative kanter!

Hva med negative kanter? Bellman-Ford til unnsetning. Den slakker alle kanter n-1 ganger. Tregere, men robust. Den kan til og med oppdage negative sykler – sykler der du kan gå i ring og få kortere og kortere avstand for alltid.

DAG-Shortest-Path er spesialtilfellet: i en DAG kan du bare prosessere nodene i topologisk rekkefølge. Lineær tid! Og her ser du koblingen til dynamisk programmering – korteste-vei i en DAG er egentlig bare DP.

🗺️ Kapittel 11: Korteste Vei fra Alle til Alle

Noen ganger trenger du ikke bare veien fra én node – du trenger alle veier mellom alle par av noder.

Floyd-Warshall er magisk enkel: tre nøstede løkker, og du bygger opp løsningen ved å vurdere stadig flere mellomliggende noder. O(n³), men utrolig elegant.

Johnsons algoritme er smartere for tynt befolkede grafer: bruk Bellman-Ford én gang for å "fikse" negative kanter, og kjør deretter Dijkstra fra hver node. Raskere enn Floyd-Warshall når det er få kanter.

🌊 Kapittel 12: Maksimal Flyt – Strømmens Kraft

Tenk på et rørsystem: hver kant har en kapasitet. Hvor mye "vann" kan du få fra kilden til sluket?

Ford-Fulkerson-metoden er ideen: finn en forøkende sti (en vei med ledig kapasitet), og send så mye flyt som mulig. Gjenta til ingen slike stier finnes.

Det geniale: residualgrafen. Når du sender flyt, lager du "tilbakekanter" som lar deg angre. Dette gjør at du alltid finner optimal løsning!

Maks-flyt/min-snitt-teoremet er en av datalogiens vakreste innsikter: maksimal flyt er alltid lik kapasiteten til det minimale snittet. Flytproblemet og snittproblemet er duale – to sider av samme mynt.

Og anvendelsene! Bipartitt matching – å pare elementer fra to grupper – er bare et flytproblem i forkledning.

🔮 Kapittel 13: NP-Kompletthet – Jungelens Dypeste Mysterium

Her møter du grensen for hva vi vet. Noen problemer – som å sjekke om en løsning er riktig – kan løses raskt. Men å finne løsningen? Det er en annen sak.

P er klassen av problemer som kan løses i polynomisk tid. NP er klassen der løsninger kan verifiseres i polynomisk tid. Det store spørsmålet: Er P = NP? Kan alt som er lett å sjekke også lett finnes?

De fleste tror nei. Og beviset ligger i NP-komplette problemer – de vanskeligste problemene i NP. Hvis du kan løse ett av dem raskt, kan du løse alle. SAT, 3-SAT, Clique, Vertex Cover, Hamiltonian Cycle, Travelling Salesman...

Du lærer å redusere: å vise at ett problem er minst like vanskelig som et annet. Og du forstår hvorfor 0-1 Knapsack er NP-hardt – selv om du løste det med DP! (Hint: kjøretiden avhenger av verdien på kapasiteten, ikke bare antall elementer.)

🦧 Din reise begynner nå

Hver 🐒 du samler betyr at du kjenner til konseptet. Hver 🦧 betyr at du virkelig forstår det – du kan bruke det, forklare det, og se når det passer.

Tips: Ikke prøv å mestre alt med én gang. Start med å samle 🐒-er – få oversikt først. Gå tilbake og samle 🦧-er når du er klar for dybden.

Jungelen venter. Lykke til, oppdager! 🌴

🦧💢

Hvor ble det av fremgangen?!

Du startet en timer, men har ikke huket av noe ennå!

💡 Åpne et kapittel og huk av et læringsmål for å roe ned apen.

❓ Vanlige spørsmål

😩 Jeg har ikke nok motivasjon til å gå gjennom disse

Det trenger du ikke! Hvis motivasjonen mangler, bare følg step-by-step kronologisk:

  1. Åpne et kapittel
  2. Klikk på 💬-knappen ved siden av et læringsmål
  3. Lim inn prompten i en AI-chat (ChatGPT, Claude, etc.)
  4. Les gjennom svaret du får
  5. Huk av 🐒 og gå videre til neste

Selv om du bare passivt leser gjennom, vil du lære noe. Det er mye bedre enn ingenting!

🤔 Hva er forskjellen på 🐒 og 🦧?

🐒 Kjennskap til: Du vet at konseptet finnes, du kjenner til terminologien, og kan gjenkjenne det når du ser det.

🦧 Forstår og kan bruke: Du kan forklare konseptet med egne ord, bruke det i praksis, og vet når det er relevant.

Tips: Start med å samle 🐒-er først – få oversikt over hele pensum. Gå tilbake for 🦧-er senere!

📝 Hvordan bruker jeg eksamensoppgavene?

Klikk på 📝-knappen ved et læringsmål for å se relevante eksamensoppgaver.

Bekreftede: Oppgaver som eksplisitt nevner dette læringsmålet i løsningsforslaget.

Potensielle: Oppgaver som handler om samme tema, men uten eksplisitt referanse.

Bruk disse til å teste deg selv etter du har lest deg opp på temaet!

💡 Hvordan får jeg mest ut av AI-promptene?

Promptene er designet for å gi deg en god, intuitiv forklaring. Men du kan gjøre mer:

  • Be om flere eksempler hvis du ikke forstår
  • Be AI-en teste deg med spørsmål
  • Spør "hvorfor fungerer dette?" for dypere forståelse
  • Be om pseudokode hvis du vil se implementasjonen
⏱️ Hvor lang tid tar dette?

Det avhenger av hvor grundig du vil være.

Husk: Litt er bedre enn ingenting.