Minimum spanning tree (Prim's) in Data Structures Theory - Time & Space Complexity
We want to understand how the time needed to find a minimum spanning tree using Prim's algorithm changes as the graph grows.
Specifically, how does the work increase when the number of nodes and edges increases?
Analyze the time complexity of the following Prim's algorithm code snippet.
function primMST(graph) {
let mstSet = new Set();
let key = Array(graph.length).fill(Infinity);
key[0] = 0;
for (let count = 0; count < graph.length; count++) {
let u = minKey(key, mstSet);
mstSet.add(u);
for (let v = 0; v < graph.length; v++) {
if (graph[u][v] && !mstSet.has(v) && graph[u][v] < key[v]) {
key[v] = graph[u][v];
}
}
}
return key;
}
This code finds the minimum spanning tree by repeatedly adding the closest vertex not yet in the tree.
Look at the loops and repeated steps:
- Primary operation: The outer loop runs once for each vertex to add it to the MST.
- How many times: For each vertex, the inner loop checks all vertices to update keys.
As the number of vertices (n) grows, the algorithm checks all vertices for each addition to the MST.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 100 checks |
| 100 | About 10,000 checks |
| 1000 | About 1,000,000 checks |
Pattern observation: The work grows roughly with the square of the number of vertices.
Time Complexity: O(n^2)
This means if you double the number of vertices, the time needed roughly quadruples.
[X] Wrong: "Prim's algorithm always runs in linear time because it just adds one vertex at a time."
[OK] Correct: Each addition requires checking all vertices to find the minimum edge, so the total work grows faster than just the number of vertices.
Understanding how Prim's algorithm scales helps you explain your choices and shows you grasp how graph size affects performance.
"What if we used a priority queue (min-heap) to select the next vertex? How would the time complexity change?"
Practice
Solution
Step 1: Understand Prim's algorithm purpose
Prim's algorithm builds a tree that connects all vertices with the minimum sum of edge weights.Step 2: Compare with other graph problems
Unlike shortest path or cycle detection, Prim's focuses on spanning all vertices with minimal total edge cost.Final Answer:
To find the minimum spanning tree connecting all vertices with the least total edge weight -> Option AQuick Check:
Prim's algorithm = Minimum spanning tree [OK]
- Confusing minimum spanning tree with shortest path
- Thinking it detects cycles
- Assuming it sorts vertices
Solution
Step 1: Identify how Prim's picks edges
Prim's algorithm always picks the edge with the smallest weight connecting the tree to a new vertex.Step 2: Choose the right data structure
A priority queue (min-heap) efficiently retrieves the smallest edge weight at each step.Final Answer:
Priority queue (min-heap) -> Option AQuick Check:
Smallest edge selection = Priority queue [OK]
- Using stack or queue which don't sort by weight
- Confusing hash table with priority queue
- Ignoring edge weights in selection
A-B: 2, A-C: 3, B-C: 1, B-D: 4, C-D: 5Using Prim's algorithm starting from vertex A, what is the total weight of the minimum spanning tree?
Solution
Step 1: Start from vertex A and pick smallest edge
Edges from A: A-B(2), A-C(3). Pick A-B with weight 2.Step 2: Add next smallest edge connecting new vertices
From B and A, edges are B-C(1), B-D(4), A-C(3). Pick B-C with weight 1.Step 3: Add next smallest edge to connect remaining vertex D
Edges from B, C, A to D: B-D(4), C-D(5). Pick B-D with weight 4.Step 4: Calculate total weight
Total = 2 + 1 + 4 = 7.Final Answer:
7 -> Option CQuick Check:
Sum edges 2+1+4 = 7 [OK]
- Choosing edges without checking if vertex is already included
- Adding edges that form cycles
- Forgetting to sum all chosen edges
graph = { 'A': {'B': 2, 'C': 3}, 'B': {'A': 2, 'C': 1, 'D': 4}, 'C': {'A': 3, 'B': 1, 'D': 5}, 'D': {'B': 4, 'C': 5} }
visited = set()
keys = {v: float('inf') for v in graph}
keys['A'] = 0
while len(visited) < len(graph):
u = min((k for k in keys if k not in visited), key=lambda x: keys[x])
visited.add(u)
for v, w in graph[u].items():
if v not in visited and w < keys[v]:
keys[v] = wSolution
Step 1: Analyze the code's MST construction
The code updates keys but does not store which vertex connects to which, so MST edges are unknown.Step 2: Identify missing MST parent tracking
Prim's algorithm requires tracking parent nodes to reconstruct the MST edges, which is missing here.Final Answer:
The algorithm does not track parent nodes to build the MST -> Option BQuick Check:
Missing parent tracking = MST incomplete [OK]
- Assuming keys alone build MST
- Ignoring parent node tracking
- Thinking visited set is not updated
Solution
Step 1: Understand edge weight role in Prim's
Prim's algorithm always picks the edge with the smallest weight connecting new vertices.Step 2: Consider zero-cost edges
Zero-cost edges are the cheapest possible, so they will be chosen first to connect vertices without increasing total cost.Step 3: Confirm no errors or ignoring
Zero-cost edges are valid and included; they do not cause errors or get ignored.Final Answer:
It treats zero-cost edges as the cheapest and includes them first to connect vertices -> Option DQuick Check:
Zero-cost edges = chosen first [OK]
- Thinking zero-cost edges cause errors
- Assuming zero-cost edges are ignored
- Believing zero-cost edges create disconnected trees
Ready to prove it?
Pass the test and this pattern moves unknown
