Datavetenskap handlar till stor del om hur man hanterar, organiserar och bearbetar data. En datastruktur är ett sätt att organisera och lagra värden eller information så att den kan användas effektivt. Datastrukturer skiljer sig från abstrakta datatyper genom att de är konkreta implementationer i minnet — de är praktiska genomföranden av en abstrakt idé och realiseras ofta med hjälp av algoritmer. Ett enkelt exempel är förhållandet mellan en lista (abstrakt datatyp) och en länkad lista (datastruktur): listan beskriver en sekvens av element, medan en länkad lista har dessutom referenser mellan noder som pekar på nästa (och ibland föregående) element och gör det möjligt att gå framåt eller bakåt i sekvensen. Att välja rätt datastruktur är en central del av programmeringen — det påverkar både prestanda och kodens komplexitet.
Vanliga typer av datastrukturer
- Arrayer (fält) — en sekvens av element i intilliggande minne. Snabb direktåtkomst (indexering), men insättning eller borttagning i mitten kan vara dyrt.
- Länkade listor — noder där varje nod innehåller data och en referens till nästa (och eventuellt föregående) nod. Bra för insättningar/borttagningar, sämre för slumpmässig åtkomst.
- StacK — LIFO-struktur (last in, first out). Används för funktionella anrop, backtracking och uttrycksutvärdering.
- Kö (Queue) — FIFO-struktur (first in, first out). Används i schemaläggning, köhantering och BFS (bredden-först-sökning).
- Träd — hierarkiska strukturer, t.ex. binära träd, binära sökträd, AVL-träd, röd-svarta träd. Används för ordnad lagring och snabba sökningar.
- Heap (prioritetskön) — specialiserat träd för att snabbt hämta största/minsta elementet. Används i prioriteringsköer och heapsort.
- Hash-tabeller — mappar nyckel → värde med genomsnittlig O(1)-åtkomststid för uppslagningar. Kräver hantering av kollisioner.
- Graf — noder (vertex) och kanter (edges). Används för nätverk, relationer, vägrutter och många optimeringsproblem.
- Set och map — abstrakta strukturer för mängder och nyckel-värde-par; implementeras ofta med hash-tabeller eller träd.
Vanliga operationer och prestanda
- Sökning — hitta ett element (linjär sökning O(n) i osorterad lista, binär sökning O(log n) i sorterad array).
- Insättning — lägga till ett element (i arrayer kan det vara O(n) om shifting krävs; i länkade listor O(1) om positionen är känd).
- Borttagning — ta bort ett element (liknande kostnad som insättning beroende på struktur).
- Åtkomst — slumpmässig åtkomst (array O(1), länkad lista O(n)).
- Traversering — gå igenom alla element (ofta O(n)).
Komplexiteten för en operation beror både på datastrukturen och på hur den är implementerad. Välj struktur utifrån vilken operation som måste vara snabbast.
Algoritmer som bygger på datastrukturer
- Sorteringsalgoritmer (t.ex. quicksort, mergesort, heapsort) arbetar främst på arrayer eller listor.
- Sökningsalgoritmer (binärsökning, hash-uppslagning) kräver ofta sortering eller en lämplig indexstruktur.
- Grafalgoritmer (BFS, DFS, Dijkstra, A*, Kruskal) använder ofta köer, stackar, prioritetskön (heap) och union-find.
- Trädfunktioner (inorder-, preorder-, postorder-traverseringar) är grundläggande för XML/HTML-parsning, uttrycksträd och databasinstruktioner.
Praktiska exempel och användningsområden
- Databaser använder B-träd och B+-träd för att göra diskbaserade sökningar effektiva.
- Sökningar i realtid och caching använder ofta hash-tabeller för snabba uppslagningar.
- Prioritetsköer (heaps) används i planering, nätverkspaketshantering och algoritmer som Dijkstra.
- Grafmodeller används för trafiknät, sociala nätverk, rekommendationssystem och ruttoptimering.
Hur väljer man rätt datastruktur?
- Identifiera vilka operationer som måste vara snabba (sökning, insättning, borttagning, åtkomst).
- Tänk på minnesanvändning och eventuell fragmentering.
- Överväg trådsäkerhet och konkurrens i multitrådade miljöer.
- Ta hänsyn till cache-lokalitet — arrayer är ofta snabbare än länkade strukturer tack vare sammanhängande minne.
- Välj en standardimplementering (bibliotekstyper) om den uppfyller kraven — det sparar tid och minskar fel.
Enkla jämförelseexempel
- Om du ofta behöver slumpmässig åtkomst (läsa element vid index) — välj en array.
- Om du ofta infogar/borttar element i mitten av en sekvens — välj en länkad lista eller en struktur som stödjer snabba insättningar.
- För snabba uppslagningar efter nyckel — välj en hash-tabell (eller ett träd om du behöver ordnad iteration).
Sammanfattningsvis är en datastruktur ett organiserat sätt att lagra data i minnet så att nödvändiga operationer kan utföras effektivt. Rätt val av datastruktur tillsammans med lämpliga algoritmer är ofta avgörande för programmens prestanda och skalbarhet.

