java - 如何详细计算这段代码的时间复杂度大O?

标签 java algorithm performance time-complexity big-o

我试图分析这段代码的时间复杂度,但我被卡住了。我是否认为它是 O(n^2) 时间复杂度,因为有两个 for 循环,或者它只是 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))

这就是原因。

  1. 对于 n 个不同的 vertex 值,我们:
  2. 对于所有 n^2 可能的边,我们:
  3. 加入优先队列,从优先队列中移除。 (都是 O(log(n^2)) = O(2 log(n)) = O(log(n)) 操作。)

所以把它们放在一起,对于 O(n^ 3 log(n)) 总计。

关于java - 如何详细计算这段代码的时间复杂度大O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50324791/

相关文章:

Java 使用 Comparable 和多个排序标准对对象进行排序

angularjs - 如何优化 Robot Framework 以加快 Angular 应用程序的测试速度?

java - 关于Java重数学计算的问题

java - 使用 Java API 添加到模型

java - 在 Java 中实现 Lucene 搜索的最佳实践

java - 使用 java mail api 触发邮件时在邮件中添加了不必要的附件

java - 将链表的所有其他元素(就地)移动到java中链表的末尾

php - 获取给定字符串的唯一 8 位数字

performance - 代码生成时间

mysql - mysql查询中如何提高查询速度