Graph Terminology Vertices Edges Directed Undirected Weighted in DSA Typescript - Time & Space Complexity
Graphs are made of points and connections. We want to understand how the work grows when we explore these connections.
How does the number of points and connections affect the time to visit or check them?
Analyze the time complexity of this simple graph traversal code.
function traverseGraph(graph: Map): void {
for (const vertex of graph.keys()) {
const edges = graph.get(vertex) || [];
for (const neighbor of edges) {
// process edge from vertex to neighbor
}
}
}
This code visits every vertex and its connected edges once.
Look at the loops that repeat work:
- Primary operation: Visiting each vertex and then each edge connected to it.
- How many times: Outer loop runs once per vertex (V times), inner loop runs once per edge connected to that vertex.
As the graph grows, the work grows with the number of vertices and edges.
| Input Size (V vertices, E edges) | Approx. Operations |
|---|---|
| 10 vertices, 15 edges | ~25 operations (10 + 15) |
| 100 vertices, 200 edges | ~300 operations (100 + 200) |
| 1000 vertices, 5000 edges | ~6000 operations (1000 + 5000) |
Pattern observation: The total work grows roughly by adding vertices and edges together.
Time Complexity: O(V + E)
This means the time to explore the graph grows with the total number of points plus connections.
[X] Wrong: "The time depends only on the number of vertices."
[OK] Correct: Edges also matter because each connection must be checked, so ignoring edges misses part of the work.
Understanding how vertices and edges affect time helps you explain graph algorithms clearly and confidently in interviews.
"What if the graph was directed instead of undirected? How would the time complexity change?"
Practice
Solution
Step 1: Understand graph components
A graph consists of points called nodes and connections called edges.Step 2: Identify the term for nodes
The points or nodes where edges meet are called vertices.Final Answer:
Vertices -> Option CQuick Check:
Nodes = Vertices [OK]
- Confusing edges with vertices
- Thinking weights are nodes
- Mixing paths with nodes
Solution
Step 1: Understand object syntax in TypeScript
Objects use key-value pairs with curly braces and colons.Step 2: Check each option's syntax
const edge = { from: 1, to: 2, weight: 5 }; correctly uses keys 'from', 'to', and 'weight' with values. const edge = [1, 2, 5]; is an array, valid but less descriptive. const edge = (1, 2, 5); uses parentheses, invalid for object. const edge = { 1: 2, 5 }; has invalid syntax.Final Answer:
const edge = { from: 1, to: 2, weight: 5 }; -> Option DQuick Check:
Object with keys and values = const edge = { from: 1, to: 2, weight: 5 }; [OK]
- Using parentheses instead of braces
- Incorrect object key syntax
- Confusing arrays with objects
type Edge = { from: number; to: number; weight: number };
const graph: Edge[] = [
{ from: 1, to: 2, weight: 3 },
{ from: 2, to: 3, weight: 4 },
{ from: 3, to: 1, weight: 5 }
];
for (const edge of graph) {
console.log(`${edge.from} -> ${edge.to} (weight: ${edge.weight})`);
}Solution
Step 1: Read the graph array
The graph array has edges: 1->2 with weight 3, 2->3 with weight 4, 3->1 with weight 5.Step 2: Trace the for loop output
The loop prints each edge in the format 'from -> to (weight: weight)'. So output matches 1 -> 2 (weight: 3) 2 -> 3 (weight: 4) 3 -> 1 (weight: 5) exactly.Final Answer:
1 -> 2 (weight: 3) 2 -> 3 (weight: 4) 3 -> 1 (weight: 5) -> Option AQuick Check:
Print edges as defined = 1 -> 2 (weight: 3) 2 -> 3 (weight: 4) 3 -> 1 (weight: 5) [OK]
- Mixing up weights and vertices
- Reversing edge directions
- Assuming syntax error
type Edge = { from: number; to: number; weight: number };
const graph: Edge[] = [
{ from: 1, to: 2, weight: 7 },
{ from: 2, to: 1, weight: 7 },
{ from: 2, to: 3, weight: 5 }
];
function addEdge(from: number, to: number, weight: number) {
graph.push({ from, to, weight });
graph.push({ from: to, to: from, weight });
}
addEdge(3, 4, 6);
console.log(graph.length);Solution
Step 1: Count initial edges
Initially, graph has 3 edges: 1->2, 2->1, 2->3.Step 2: Analyze addEdge function call
addEdge(3, 4, 6) pushes { from: 3, to: 4, weight: 6 } and { from: 4, to: 3, weight: 6 }, adding 2 more edges for undirected graph.Step 3: Calculate final length
3 initial + 2 added = 5. No errors occur; code runs successfully.Final Answer:
No error; graph length will be 5 -> Option AQuick Check:
3 + 2 = 5 [OK]
- Assuming duplicate edges cause error
- Miscounting edges after push
- Thinking graph is immutable
const graph: Record = {
1: [{ node: 2, weight: 4 }, { node: 3, weight: 1 }],
2: [{ node: 1, weight: 4 }, { node: 3, weight: 2 }, { node: 4, weight: 5 }],
3: [{ node: 1, weight: 1 }, { node: 2, weight: 2 }, { node: 4, weight: 8 }],
4: [{ node: 2, weight: 5 }, { node: 3, weight: 8 }]
};
// How to find the total weight of edges connected to vertex 2?
Which code snippet correctly calculates the total weight of edges connected to vertex 2?Solution
Step 1: Understand adjacency list structure
graph[2] is an array of edges connected to vertex 2, each with a weight property.Step 2: Calculate total weight
Use reduce to sum all edge weights in graph[2]. const total = graph[2].reduce((sum, edge) => sum + edge.weight, 0); correctly sums weights. const total = graph[2].map(edge => edge.weight).length; counts edges, not sum. const total = graph[2].filter(edge => edge.weight > 0); filters edges, no sum. const total = graph.reduce((sum, edges) => sum + edges.weight, 0); tries to reduce graph object, invalid.Final Answer:
const total = graph[2].reduce((sum, edge) => sum + edge.weight, 0); -> Option BQuick Check:
Sum weights with reduce = const total = graph[2].reduce((sum, edge) => sum + edge.weight, 0); [OK]
- Using map length instead of sum
- Filtering without summing
- Reducing wrong data structure
Ready to prove it?
Pass the test and this pattern moves unknown
