Skip to content

Commit

Permalink
Merge graph and counting sort commits into restructured repo
Browse files Browse the repository at this point in the history
  • Loading branch information
Xtrah committed Nov 1, 2020
2 parents 8bdaed8 + 512559f commit 26ae73d
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
4 changes: 2 additions & 2 deletions Algoritmer/Sortering/counting_sort.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ TODO | TODO | TODO | TODO

## Python kodeeksempel

Ved universitetet på Pluto har hvert emne sin egen karakterskala. For et gitt emne består karakterskalaen av alle heltall ii, slik at 0⩽i⩽k0⩽i⩽k. Administrasjonen ved universitetet ønsker å sortere karakterene i emnene, slik at de lettere kan utføre statistiske utregninger. Dessverre kjenner ikke administrasjonen til verdien for kk for hvert enkelt emne, de vet kun at denne verdien alltid er slik at k<2048k<2048.
Ved universitetet på Pluto har hvert emne sin egen karakterskala. For et gitt emne består karakterskalaen av alle heltall i, slik at 0⩽i⩽k. Administrasjonen ved universitetet ønsker å sortere karakterene i emnene, slik at de lettere kan utføre statistiske utregninger. Dessverre kjenner ikke administrasjonen til verdien for k for hvert enkelt emne, de vet kun at denne verdien alltid er slik at k<2048.

Implementer en variant av COUNTING-SORTCOUNTING-SORT som ikke tar inn kk, men som alltid vil kunne sortere en liste av karakterer i et emne ved universitetet på Pluto. Metoden skal skrive resultatet til BB, som har lik lengde som AA.
Implementer en variant av COUNTING-SORT&trade; som ikke tar inn k, men som alltid vil kunne sortere en liste av karakterer i et emne ved universitetet på Pluto. Metoden skal skrive resultatet til B, som har lik lengde som A.

```python
def counting_sort(A, B):
Expand Down
43 changes: 40 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -511,9 +511,6 @@ Disse egenskapene sammen gir en optimal løsning.
Huffmans algoritme er en grådig algoritme som komprimerer data veldig effektivt, vanligvis mellom 20%-90%. Algoritmen bruker en tabell som teller antall hendelser av hvert tegn i en sekvens med tegn, og bygger et binærtre basert på frekvensene.

## Traversering av grafer

Vi traverserer en graf ved å besøke noder vi vet om. Vi vet i utgangspunktet bare om startnoden, men oppdager naboene til dem vi besøker. Traversering er viktig i seg selv, men danner også ryggraden til flere mer avanserte algoritmer.

<!-- [H1] Forstå hvordan grafer kan implementeres -->
<!-- [H2] Forstå BFS, også for å finne korteste vei uten vekter -->
<!-- [H3] Forstå DFS og parentesteoremet -->
Expand All @@ -523,6 +520,46 @@ Vi traverserer en graf ved å besøke noder vi vet om. Vi vet i utgangspunktet b
<!-- [H7] Forstå hva traverseringstrær (som bredde-først- og dybde-først-trær) er -->
<!-- ![H8] Forstå traversering med vilkårlig prioritetskø -->

Vi traverserer en graf ved å besøke noder vi vet om. Vi vet i utgangspunktet bare om startnoden, men oppdager naboene til dem vi besøker. Traversering er viktig i seg selv, men danner også ryggraden til flere mer avanserte algoritmer.

Traversering har matching som motivasjon:

- Vi husker hvor vi kom fra.
- Vi besøker ikke samme node mer enn en gang
- Vi lager et traverseringstre. Finner stier fra startnoeden til alle noder vi når fram til.
- Vi besøker noder, oppdager noder langst kanter og vedlikeholder en huskeliste.

### Grafrepresentasjoner:

- Nabomatriser
- Nabolister

**Nabomatriser:**

Viser forholdet mellom noder ved hjelp av en matrise og verdier for eksistens av forhold.

![Illustrasjon nabomatrise](https://i.postimg.cc/vHsGRZ33/image.png)

*Spørsmål:* Er 5 nabo med 4?

**Svar:** Sjekk rad 5 kolonne 4. Hvis det står "1", ja, da er de naboer med et forhold fra 5 til 4 (5->4). I figuren er det vist et symmetrisk forhold. Det innebærer at 5 er nabo med 4 og 4 er nabo med 5. Grafen er urettet.

Godt egnet til raske oppslag, ikke så mye til traversering: For oppslag trenger du kun å sjekke rad for så å sjekke respektiv kolonne for å finne ut om et forhold eksisterer. For traversering må man gå over flere ruter som ikke har noe innhold for å sjekke en hel rad. I tillegg kan nabomatriser fort ta mye plass.

De fleste algoritmer bruker $\Omega(V^{2})$ operasjoner med nabomatriser. Der V er antallet noder (vertices). Det finnes unntak! (Se kjendisproblemet fra forelesning 8)

**Nabolister:**

Liste (eller tabell) med ut-naboer for hver node

![Illustrasjon nabolister](https://i.postimg.cc/XvpttRFV/image.png)

*Spørsmål:* Hvem er naboen til 5?

**Svar:** Sjekk indeks 5, se igjennom listen. Naboene til 5 er 3 og 4.

Godt egnet til traversering, men dårligere til oppslag: For traversering er nabolister en kompakt metode der vi ikke trenger å gå innom noder som ikke har noe forhold. For oppslag må vi derimot gå igjennom lenger lister dersom det er mange pekere på forskjellige noder. Dersom grafen har få kanter vil nabolister også ta mindre plass enn nabomatriser.

## Minimale spenntrær

Her har vi en graf med vekter på kantene, og ønsker å bare beholde akkurat de kantene vi må for å koble sammen alle nodene, med en så lav vektsum som mulig. Erke-eksempel på grådighet: Velg én og én kant, alltid den billigste lovlige.
Expand Down

0 comments on commit 26ae73d

Please sign in to comment.