Tilbake
21

21 Datastrukturer og algoritmer

Lister, arrays, ordbøker og grunnleggende algoritmer for søk og sortering.

65 min
7 oppgaver
ListeOrdbokAlgoritmeKompleksitetO(n)
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 7 oppgaver

Lister og arrays

Lister i Python
Ei liste er ei ordna samling av element som kan endrast (mutable).

# Opprette lister
sensorer = [23.5, 24.1, 22.8, 25.0]
navn = ["sensor1", "sensor2", "sensor3"]
blandet = [1, "tekst", 3.14, True]

# Tilgang til elementer (0-indeksert)
print(sensorer[0])   # 23.5 (første element)
print(sensorer[-1])  # 25.0 (siste element)

# Endre element
sensorer[1] = 24.5

# Legge til elementer
sensorer.append(26.0)     # Legger til på slutten
sensorer.insert(0, 22.0)  # Setter inn på posisjon 0

# Fjerne elementer
sensorer.remove(22.8)     # Fjerner første forekomst
siste = sensorer.pop()    # Fjerner og returnerer siste

# Lengde
print(len(sensorer))

Slicing (utsnitt)

tall = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(tall[2:5])   # [2, 3, 4] (fra indeks 2 til 5-1)
print(tall[:3])    # [0, 1, 2] (fra start til 3-1)
print(tall[7:])    # [7, 8, 9] (fra 7 til slutt)
print(tall[::2])   # [0, 2, 4, 6, 8] (annethvert element)

Ordbøker (dictionaries)

Ordbøker lagrar data som nøkkel-verdi par. Rask oppslag basert på nøkkel.

# Opprette ordbok
sensor_data = {
    "temperatur": 23.5,
    "fuktighet": 65,
    "trykk": 1013.25,
    "enhet": "celsius"
}

# Tilgang til verdier
print(sensor_data["temperatur"])  # 23.5
print(sensor_data.get("vind", 0)) # 0 (standardverdi hvis ikke funnet)

# Legge til / endre
sensor_data["vind"] = 5.2
sensor_data["temperatur"] = 24.0

# Sjekke om nøkkel finnes
if "fuktighet" in sensor_data:
    print("Fuktighet funnet!")

# Iterere
for nokkel, verdi in sensor_data.items():
    print(f"{nokkel}: {verdi}")

# Nøstede ordbøker
vaerstasjon = {
    "stasjon1": {"temp": 22, "fukt": 60},
    "stasjon2": {"temp": 25, "fukt": 55}
}
print(vaerstasjon["stasjon1"]["temp"])  # 22

Når bruke liste vs ordbok?
- Liste: Ordna element, numerisk indeks, iterering
- Ordbok: Nøkkel-oppslag, skildrande nøklar, strukturerte data

Søkjealgoritmar

Lineært søk
Går gjennom lista element for element til vi finn det vi leitar etter.

def lineart_sok(liste, verdi):
    for i, element in enumerate(liste):
        if element == verdi:
            return i  # Fant på posisjon i
    return -1  # Ikke funnet

tall = [5, 2, 8, 1, 9, 3]
pos = lineart_sok(tall, 8)  # Returnerer 2

Kompleksitet: O(n) - i verste fall må vi sjekke alle n element.

Binært søk
Krev sortert liste. Halverer søkjeområdet for kvar iterasjon.

def binaert_sok(sortert_liste, verdi):
    lav = 0
    hoy = len(sortert_liste) - 1

    while lav <= hoy:
        midt = (lav + hoy) // 2
        if sortert_liste[midt] == verdi:
            return midt
        elif sortert_liste[midt] < verdi:
            lav = midt + 1
        else:
            hoy = midt - 1
    return -1

tall = [1, 2, 3, 5, 8, 9]  # MÅ være sortert!
pos = binaert_sok(tall, 5)  # Returnerer 3

Kompleksitet: O(log n) - mykje raskare for store lister!

Samanlikning:
- 1000 element: Lineært ~500 samanlikningar, binært ~10
- 1 000 000 element: Lineært ~500 000, binært ~20

Sorteringsalgoritmar

Boblesortering (Bubble Sort)
Samanliknar naboelement og byter viss dei er i feil rekkjefølgje. Gjenta til sortert.

def boblesortering(liste):
    n = len(liste)
    for i in range(n):
        for j in range(0, n-i-1):
            if liste[j] > liste[j+1]:
                liste[j], liste[j+1] = liste[j+1], liste[j]
    return liste

tall = [64, 34, 25, 12, 22, 11, 90]
sortert = boblesortering(tall.copy())
# [11, 12, 22, 25, 34, 64, 90]

Kompleksitet: O(n²) - treg for store lister

Innebygd sortering
Python har effektiv innebygd sortering:

tall = [64, 34, 25, 12]

# sorted() returnerer ny sortert liste
sortert = sorted(tall)

# .sort() sorterer listen "in-place"
tall.sort()

# Sortere i synkende rekkefølge
tall.sort(reverse=True)

# Sortere etter egendefinert nøkkel
sensorer = [("A", 25), ("B", 18), ("C", 30)]
sensorer.sort(key=lambda x: x[1])  # Sorterer etter temperatur
# [('B', 18), ('A', 25), ('C', 30)]

Kompleksitet:
- Boblesortering: O(n²)
- Python sort (Timsort): O(n log n)
- For 1000 element: Boble ~1 000 000 operasjonar, Timsort ~10 000

📝Oppgave

Skriv kode som finn gjennomsnittet av alle tal i ei liste.

📝Oppgave

Lag ei ordbok som representerer ein sensor med felta: id, type, verdi, enhet, tidspunkt. Skriv kode som skriv ut ein formatert rapport.

📝Oppgave

Forklar skilnaden mellom lineært søk og binært søk. Når er binært søk betre?

📝Oppgave

Skriv ein funksjon som finn det største og minste elementet i ei liste utan å bruke innebygde funksjonar (min/max).

📝Oppgave

Kva tyder O(n) og O(n²) notasjon? Gjev eksempel på algoritmar med kvar kompleksitet.

📝Oppgave

Du har ei liste med 1000 temperaturmålingar. Skildre ein algoritme som finn dei 10 høgaste temperaturane og tidspunkta dei vart målte.

📝Oppgave

Design ein datastruktur for å lagre data frå ein værstasjon (temperatur, fukt, trykk, vindretning, vindfart) over 24 timar med målingar kvart 5. minutt. Skildre korleis du vil organisere dataa.

Oppgaver

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.