This algorithm can be used to solve dynamic connectivity
problem. This algorithm is kept very simple. It supports two operations,
·
connected(a, b) check if a and b are in the same component
·
union(a, b)
if two elements are not in the same component then this operation merge these
components(merge(component of a, component of b))
Data-Structure
connected(a, b)
Return
true if both are in the same component. It just checks id[a] and id[b] are
equal or not. It takes constant time O(1).
union(a, b)
This
operation first checks if a and b are already in the same component. If a and b
are in different component, then union merge these two component. Here every
elements of the component containing a is replaced by the component of b. It
takes linear time O(Number of nodes).
Here
is the JAVA Implementation of this algorithm.
package quickfinduf; /** * * @author imdad */ public class QuickFindUF { private int[] id; public QuickFindUF(int N) { id = new int[N]; for (int i = 0; i < N; i++) { id[i] = i; } } public boolean connected(int a, int b) { return id[a] == id[b]; } public void union(int a, int b) { System.out.println("union(" + a + "," + b + ")");//union operation of a and b printID();//id[] before union operation if (!connected(a, b)) { int aid = id[a]; int bid = id[b]; for (int i = 0; i < id.length; i++) { if (id[i] == aid) { id[i] = bid; } } } printID();//id[] changed after union operation } private void printID() {//Method to see state of datastructure id[] System.out.print(id[0]); for (int i = 1; i < id.length; i++) { System.out.print(" " + id[i]); } System.out.println(); } public static void main(String[] args) { QuickFindUF obj = new QuickFindUF(10); obj.union(4, 3); //obj.printID(); obj.union(3, 8); obj.union(6, 5); obj.union(9, 4); obj.union(2, 1); System.out.println(obj.connected(8, 9) ? "8 and 9 are connected" : "8 and 9 are not connected"); System.out.println(obj.connected(5, 0) ? "5 and 0 are connected" : "5 and 0 are not connected"); obj.union(5, 0); obj.union(7, 2); obj.union(6, 1); } }
Complexity
Initialization
Initialization will take O(N) operations(Array initialization) where N is the number of component.
Union
Each union operation will take heist O(N) time, Here N is the component size of the first parameter of union() operation.
Connected
It will take constant time O(1).
So, Quick-Union Algorithm is a Quadratic O(N^2) time algorithm.
Initialization will take O(N) operations(Array initialization) where N is the number of component.
Union
Each union operation will take heist O(N) time, Here N is the component size of the first parameter of union() operation.
Connected
It will take constant time O(1).
So, Quick-Union Algorithm is a Quadratic O(N^2) time algorithm.
No comments:
Post a Comment