我试图分析这个代码的时间复杂度是多少,但是我被卡住了。我认为这是O(n 2)的时间复杂度,因为这两个循环,或者仅仅是O(n),因为第二个for循环不是总是运行的吗?
有了这个代码,我必须扫描一个基于图形的二维数组

//adj is edgeMatrix
public int[] getClosenessCentrality(int[][] adj){
    int size = adj.length * adj.length;
    int[] closeness = new int[size];
    for (int vertex = 0; vertex < adj.length; vertex++) {
        boolean[] visited = new boolean[size];
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>(size);


        pq.add(vertex);


        while (!pq.isEmpty()) {
            int u = pq.remove();
            if(!visited[u]) {
                visited[u] = true;
                for (int i = 0; i < size; i++) {
                    //Priority Queue speeds up extract-min
                    if (!visited[i]) {
                        if (adj[u][i] > 0) {
                            pq.add(adj[u][i]+1);
                        }

                    }
                }
                closeness[vertex] += 1;
            }

        }
    }

    return closeness;
}

最佳答案

如果n = adj.length复杂性为O(n^3 log(n))
这就是原因。
对于n的不同值,我们:
对于所有可能的边缘,我们:
添加到优先级队列,然后从优先级队列中删除(都是vertex操作。)
所以把它放在一起,我们就有了对于n^2合计的复杂度O(log(n^2)) = O(2 log(n)) = O(log(n))的可能操作。

10-06 08:46