Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个算法是线性的而不是线性的? int和=0; 对于(int n=n;n>0;n/=2) 对于(int i=0;i_Java_Algorithm_Complexity Theory_Big O - Fatal编程技术网

Java 为什么这个算法是线性的而不是线性的? int和=0; 对于(int n=n;n>0;n/=2) 对于(int i=0;i

Java 为什么这个算法是线性的而不是线性的? int和=0; 对于(int n=n;n>0;n/=2) 对于(int i=0;i,java,algorithm,complexity-theory,big-o,Java,Algorithm,Complexity Theory,Big O,我很确定它是在nlogn中生长的,但有人告诉我它是线性的。。。为什么它是线性的而不是线性的 它是线性的。想象一下,n是64。内部循环运行64次、32次、16次、8次、4次、2次、1次。64+32+16+8+4+2+1=127 因此它需要2n-1总操作(对于2的幂,但这不会改变分析),假设内部循环没有优化。这显然是线性的 如果对内部for循环进行优化(到sum+=n;),则它是对数的。此算法的复杂度为Θ(n) 操作数为 int sum = 0; for (int n = N; n > 0;

我很确定它是在nlogn中生长的,但有人告诉我它是线性的。。。为什么它是线性的而不是线性的

它是线性的。想象一下,
n
是64。内部循环运行64次、32次、16次、8次、4次、2次、1次。64+32+16+8+4+2+1=127

因此它需要
2n-1
总操作(对于2的幂,但这不会改变分析),假设内部循环没有优化。这显然是线性的


如果对内部for循环进行优化(到
sum+=n;
),则它是对数的。

此算法的复杂度为Θ(n)

操作数为

int sum = 0; 
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++)
      sum++; 
这个级数的和是

sum{2**k} for k = 0..log2(N)

也就是Θ(N)

正式地说,使用西格玛符号可以帮助你清楚地看到增长的顺序是线性的


“线性数学”?你是说“对数”吗?@duffymo:以前从没听说过这个词。我可以称之为对数线性。我会在谷歌上搜索你的术语。log linear已经有了不同的含义。我第一次听到它:我不确定我是否明白,它不是第一次击中了内部循环的每个元素吗?@BlackPlanet:很好,我会解决这个问题。可能
k=0..log2(N)
-我看到的结论没有什么不同。我不太熟悉那个符号。“0..log2(N)”
2*N-1