java - Java 和 Bellman-Ford 中的加权有向图实现

标签 java algorithm graph time-complexity bellman-ford

我正在尝试找出在 Java 中实现加权有向图的最佳方法,以便我可以将 Bellman-Ford 上的运行时间保持在 |V|*|E|。本质上,我的问题是如何表示图中的边。

我见过邻接矩阵的使用,但我似乎无法弄清楚如何在使用邻接矩阵的同时将运行时间保持在 O(V^2) 以下。我得到 V^2 作为运行时间的原因是因为 Bellman-Ford 要求我们遍历所有边缘,但它为了获得边缘列表我需要遍历整个矩阵以获得所有边缘。使用邻接矩阵是否可以比 O(V^2) 时间更快地获取边列表?

或者我需要使用邻接表吗?

最佳答案

您可以轻松地为邻接列表实现一个类。以下是我经常用作邻接列表的类,这也很容易理解。它将一个整数映射到一个链表

class Adjacencylist {

    private Map<Integer, List<Integer>> adjacencyList;

    public Adjacencylist(int v){    //Constructor
        adjacencyList = new HashMap<Integer,List<Integer>>();
        for(int i=0;i<v;++i){
            adjacencyList.put(i, new LinkedList<Integer>());
        }
    }

    public void setEdge(int a,int b){    //method to add an edge
        List<Integer> edges=adjacencyList.get(a);
        edges.add(b);
    }

    public List<Integer> getEdge(int a){
        return adjacencyList.get(a);
    }

    public boolean contain(int a,int b){
        return adjacencyList.get(a).contains(b);
    }

    public int numofEdges(int a){
        return adjacencyList.get(a).size();
    }

    public void removeEdge(int a,int b){
        adjacencyList.get(a).remove(b);
    }

    public void removeVertex(int a){
        adjacencyList.get(a).clear();
    }

    public void addVertex(int a){
        adjacencyList.put(a, new LinkedList<Integer>());
    }
}

在您提示我需要实现加权图之前,请考虑将 HashMap 映射到 Integer。您可以通过将 linked list 替换为 hash map 来相应地更改函数。这为您节省了 O(n^2) 的时间复杂度。

关于java - Java 和 Bellman-Ford 中的加权有向图实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351353/

相关文章:

javascript - 如何在 JavaScript 中检查图形是否循环

java - eclipse中Ctrl Alt H和f4有什么区别

performance - "Fast Integer Multiplication Using Modular Arithmetic"(2008) 算法什么时候比 Schönhage-Strassen 算法快?

algorithm - O(1)+O(2)+ .... +O(n) 的阶和

c++ - 使用 Barabási-Albert 模型计算和理解无标度网络

python - 从数学函数创建图形

java - 错误: on a null object reference, SavedInstanceState旋转回收器 View

java - 在不使用 Callable 的情况下从线程引发异常?

java - 异步任务和线程

algorithm - 如何测试算法实现?