Java 如何确定嵌套循环中语句的执行频率?
我正在阅读一段关于使用递归关系确定嵌套循环的复杂性的文章。在这个特定的例子中,我试图确定count变量作为n的函数将增加多少次 这是我正在分析的循环: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; } } 我想我理解第一行将简单地
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;
}