我试图分析这个代码的时间复杂度是多少,但是我被卡住了。我认为这是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))
的可能操作。