Java实现Kruskal的算法 - 在大型实例上运行时间非常长

时间:2016-12-19 11:34:50

标签: java algorithm runtime

我正在最小的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作为字段的对象。

0 个答案:

没有答案