我正在最小的DIMACS挑战9个实例上测试它:纽约 (更多这里:http://www.dis.uniroma1.it/challenge9/download.shtml)
实例大小:264,346个顶点和733,846个边
我的运行时间大约是260秒,而Kruskal和Prim的算法通常只需几秒钟。
我正在使用路径压缩和按等级联合,我无法弄清楚为什么我的运行时间如此之高,如果它只是算法和实例的组合。
一些片段:
public void union(UnionFindNode<T> setOne, UnionFindNode<T> setTwo){
UnionFindNode<T> rootOne = find(setOne);
UnionFindNode<T> rootTwo = find(setTwo);
//union by depth (rank)
if(rootOne == rootTwo){
return;
}
if(rootOne.getRank() < rootTwo.getRank()){
rootOne.setParent(rootTwo);
}
else if(rootOne.getRank() > rootTwo.getRank()){
rootTwo.setParent(rootOne);
}
else{
rootTwo.setParent(rootOne);
rootOne.setRank(rootOne.getRank() + 1);
}
}
public UnionFindNode<T> find(UnionFindNode<T> start){
//get parent of current node
UnionFindNode<T> parent = start.getParent();
//if not root
if(parent != start){
//compress path to root
start.setParent(find(parent));
}
//return final parent
return start.getParent();
}
UnionFindNode只是一个具有T数据,UnionFindNode父级和int rank作为字段的对象。