Java 如何确定嵌套循环中语句的执行频率?

Java 如何确定嵌套循环中语句的执行频率?,java,algorithm,complexity-theory,nested-loops,Java,Algorithm,Complexity Theory,Nested Loops,我正在阅读一段关于使用递归关系确定嵌套循环的复杂性的文章。在这个特定的例子中,我试图确定count变量作为n的函数将增加多少次 这是我正在分析的循环: for (int i = 1; i <= n; i++) { int j = n; while (j > 0) { count++; j = j / 2; } } for(int i=1;i 0){ 计数++; j=j/2; } } 我想我理解第一行将简单地

我正在阅读一段关于使用递归关系确定嵌套循环的复杂性的文章。在这个特定的例子中,我试图确定count变量作为n的函数将增加多少次

这是我正在分析的循环:

for (int i = 1; i <= n; i++) {
     int j = n;
     while (j > 0) {
           count++;
           j = j / 2;
     }
}
for(int i=1;i 0){
计数++;
j=j/2;
}
}
我想我理解第一行将简单地等同于n,因为它只对n的每个值执行,但它的其余部分我遇到了麻烦。我认为答案应该是n(n/2),除了这个例子使用整数除法,所以我不确定如何用数学表示


我已经在纸上手工运行了几次循环,所以我知道对于n个值1-6,count变量应该等于1、4、6、12、15和18。我就是想不出这个公式。。。任何帮助都将不胜感激

循环在
[1,n]
范围内为
n
执行。对于设置为n的
j
变量,它每次除以2,因此内部循环执行的时间是
floor(l2(n))+1,
,其中l2是二进制日志函数。将从1到n的所有这些值相加(乘以
n
)。

内部
j
循环将第一个设置位的位置相加进行计数

每除以2等于右移,直到所有位都为零

所以,2在二进制中是10,对于内部循环,它的值是2。 4在二进制中为100,内部循环的值为3

外部循环似乎只是将第一个设置位的位置乘以数字本身


下面是一个n=13的示例

二进制中的13是1101,因此第一个设置位位于位置4

4*13=52。52是最后的答案


对于(inti=1;i+1)来说,将其表示为
floor(l2(i))+1
(j通过内部循环每次递减;我控制内部循环执行的次数)。实际上,我收回它。它不是
floor(l2(i))+1
floor(l2(j))+1
。它是
floor(l2(n))+1
。最后的答案是
n
的倍。谢谢你的帮助!如果我理解正确,我的整个循环将用n((下限(l2(n))+1)来描述。为了刷新我的记忆,因为这是我第一次使用这些概念,这里的下限表示不大于l2(n)的最大整数?@Stavrosnco我刚刚注意到,
j
总是被定义为
n
。因此,Ted Hopp是正确的。很抱歉,有任何混淆。
 int j = n;
 while (j > 0) {
       count++;
       j = j / 2;
 }