algorithm - 这里的复杂性顺序是什么?

标签 algorithm data-structures time-complexity complexity-theory

   for(int i = n; i > 0; i/=3){
       for(int j = 0; j < i; j++){
           System.out.println("Hello");
       }
   }

O(n)还是O(nlog n)

外部循环将运行 log3 n 次 - 因为迭代器被常数 3 分解。

因此,外循环将被调用 log3 n

属于O(nlog n)

最佳答案

这部分n + n/3 + n/9 + ..... = n/3 (1 + 1/2 + 1/3 + ....) 不正确.

实际上

n + n/3 + n/9 + ..... = n( 1 + 1/3 + 1/9 +...)

1 + 1/3 + 1/9 + ... = a / (1-r)其中a = 1r = 1/3

收敛于3/2

因此复杂度为O(n*(3/2))O(n)

实际上,直观上我会这样想:假设外循环为您提供了您想要解决的问题的输入大小。 所以内部循环就像编写多个不同大小的 for 循环,如下所示:

for ( k = 1 to n )

for ( k = 1 to n/3 )

for ( k = 1 to n/9 )

....

如果您查看这些 for 循环,复杂性似乎会收敛于 O(n),因为 for 循环的数量取决于 n 并且正在递减/em>,但如果它是像 k 这样的常量,那么它将是 O(n*k)

关于algorithm - 这里的复杂性顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61738166/

相关文章:

c++ - 如何调用预定义结构类型的函数

c - 插入双向链表

string - 查找字符串中重复子串的数量

algorithm - 图算法 : reachability from adjacency map

java - 测试两个二叉树是否相等的最有效方法

arrays - 二分搜索与二分搜索树

c# - 适当的类似列表的排序数据结构

java - 这种添加是否保留了 DFS 的空间和时间复杂度?

java - 是否有计算组件净需求的最佳算法?

algorithm - 对知道它们以前的项目进行排序