Graph
GrafEn ikke-lineær datastruktur bestående af nodes (vertices) forbundet med kanter (edges).
Kompleksitet
| Operation | Tidskompleksitet |
|---|---|
| Access | O(V + E) |
| Search | O(V + E) |
| Insertion | O(1) |
| Deletion | O(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