← Tilbage til strukturer

Graph

Graf

En ikke-lineær datastruktur bestående af nodes (vertices) forbundet med kanter (edges).

Kompleksitet

OperationTidskompleksitet
AccessO(V + E)
SearchO(V + E)
InsertionO(1)
DeletionO(V + E)

Beskrivelse

En Graph er en kraftfuld datastruktur der består af vertices (nodes) og edges (kanter) der forbinder disse nodes. Graphs kan være directed (retningskanter som envejsgader) eller undirected (tovejsforbindelser), weighted (kanter med vægt/cost) eller unweighted, og cyclic eller acyclic. Graphs repræsenteres typisk via adjacency lists (hver node har liste af naboer) eller adjacency matrices (2D array af forbindelser). De er fundamentale for at modellere relationer og netværk - fra sociale netværk til transport systemer. Klassiske graph algoritmer inkluderer Dijkstra's shortest path, Breadth-First Search (BFS), Depth-First Search (DFS), og minimum spanning trees. Graphs er essentielle i moderne computing for routing, scheduling, dependency resolution og meget mere.

Kode Eksempel

// JavaScript Graph implementation (Adjacency List)
class Graph {
  constructor() {
    this.adjacencyList = {};
  }

  // Tilføj vertex
  addVertex(vertex) {
    if (!this.adjacencyList[vertex]) {
      this.adjacencyList[vertex] = [];
    }
  }

  // Tilføj edge
  addEdge(vertex1, vertex2) {
    this.adjacencyList[vertex1].push(vertex2);
    this.adjacencyList[vertex2].push(vertex1); // Undirected
  }

  // Fjern edge
  removeEdge(vertex1, vertex2) {
    this.adjacencyList[vertex1] = this.adjacencyList[vertex1]
      .filter(v => v !== vertex2);
    this.adjacencyList[vertex2] = this.adjacencyList[vertex2]
      .filter(v => v !== vertex1);
  }

  // Breadth-First Search
  bfs(start) {
    const queue = [start];
    const visited = new Set([start]);
    const result = [];

    while (queue.length) {
      const vertex = queue.shift();
      result.push(vertex);

      this.adjacencyList[vertex].forEach(neighbor => {
        if (!visited.has(neighbor)) {
          visited.add(neighbor);
          queue.push(neighbor);
        }
      });
    }
    return result;
  }

  // Depth-First Search
  dfs(start, visited = new Set(), result = []) {
    visited.add(start);
    result.push(start);

    this.adjacencyList[start].forEach(neighbor => {
      if (!visited.has(neighbor)) {
        this.dfs(neighbor, visited, result);
      }
    });
    return result;
  }
}

Anvendelsesområder

  • Sociale netværk (venner, følgere)
  • Navigation og GPS routing
  • Dependency resolution i package managers
  • Network topology og routing protocols
  • Recommendation systems

Fordele

  • Modellerer komplekse relationer naturligt
  • Fleksibel til mange domæner
  • Kraftfulde traversal algoritmer
  • Understøtter weighted og directed connections
  • Skalerer til meget store netværk

Ulemper

  • Kompleks at implementere korrekt
  • Kan være hukommelseskrævende
  • Nogle algoritmer har høj tidskompleksitet
  • Svær at visualisere ved store graphs
  • Cycle detection kan være kompleks

Eksempler fra den virkelige verden

  • Facebook vennenetværk
  • Google Maps vejnetværk
  • LinkedIn professionelle forbindelser
  • Flyruteplan mellem byer
  • Internet routing mellem servere

Relaterede strukturer

Directed GraphWeighted GraphTreeDAGNetwork Flow