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

时间:2012-11-16 02:21:53

标签: java algorithm complexity-theory nested-loops

我正在研究使用递归关系确定嵌套循环复杂性的文本部分。在这个特定的例子中,我试图确定计数变量将作为n的函数递增多少次。

这是我正在分析的循环:

for (int i = 1; i <= n; i++) {
     int j = n;
     while (j > 0) {
           count++;
           j = j / 2;
     }
}

我想我明白第一行简单地等同于n,因为它只对n的每个值执行,但是其余部分我遇到了麻烦。我认为答案将是n(n / 2),除了这个例子使用整数除法,所以我不知道如何用数学表示。

我在纸上手工完成了几次循环,所以我知道,对于n值为1-6,count变量应该等于1,4,6,12,15和18。我似乎无法想出公式......任何帮助都将不胜感激!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

内部j循环将第一个设置位的位置添加到计数中。

每次除以2与右移相同,直到所有位为零。

因此,2是二进制的10,内循环的值是2。 4将是二进制100,内循环的值为3。

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


以下是n = 13的示例。

三进制的13是1101,所以第一个设置位在位置4。

4 * 13 = 52. 52是最终答案。

答案 2 :(得分:0)

  

for(int i = 1; i&lt; = n; i ++){

此顶部的循环经过循环n次

 int j = n;
 while (j > 0) {
       count++;
       j = j / 2;
 }

这个循环通过循环log(n)次,注意它是一个基数为2的日志,因为你每次除以2。

因此,总数是 n * ceiling(log(n))