3
votes

I was at an interview and interviewer asked me a question:

We have a graph G(V,E), we can find MST using prim's or kruskal algorithm. But these algorithms do not take into the account that there are "very few" edges in G. How can we use this information to improve time complexity of finding MST? Can we find MST in linear time?

The only thing I could remember was that Kruskal's algorithm is faster in a sparse graphs while Prim's algorithm is faster in really dense graphs. But I couldn't answer him how to use prior knowledge about the number of edges to make MST in linear time.

Any insight or solution would be appreciated.

2
Do you have any explicit meaning for "very few"? Maybe |E| = O(|V|)? Maybe |E| = |V| + O(1)?anatolyg
No actually. I asked but he didn't say anything.Haroon S.
this problem is the subject of CLRS problem 23-2 "Minimum spanning tree on sparse graph"xdavidliu

2 Answers

5
votes

Kruskal's algorithm is pretty much linear after sorting the edges. If you use a union find structure like disjoint set forest The complexity for processing a single edge will be in the order of lg*(n) where n is the number of vertices and this function grows so slowly that for this case can be considered constant. However the problem is that to sort the edges you still need a O(m * log(m)). Where m is the number of edges.

Prim's algorithm will not be able to take advantage of the fact that the edges are very few.

One approach that you can use is something like a 'reversed' MST approach where you start off with all edges and remove the longest edge until the graph becomes disconnected. You keep doing that until only n - 1 edges are left. Still note that this will be better than Kruskal only if the number of edges to remove k are few enough so that k * n < m * log(m).

0
votes

Lets say |E| = |V| +c ,c being a small constant. You can run DFS on the graph and every time you detect a circle, remove the largest edge. you must do that c +1 times. O(c+1 * |E|) = O(E) linear time in theory.