我正在研究使用递归关系确定嵌套循环复杂性的文本部分。在这个特定的例子中,我试图确定计数变量将作为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。我似乎无法想出公式......任何帮助都将不胜感激!
答案 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))