为什么这段代码的大 O 表示法不是 log(log(n))
Why this code´s Big-O notation is not log(log(n))
明天我们有期中考试,我们不能解决这段代码的大O符号:
for(int i =1; i<n;i=i*2)
{
for(int j=1; j<i; j = j*2)
{
cout << "hello";
}
}
我们认为它可以是“log(log(n))”,但事实并非如此。
如果我们做一个图形table,我们可以看到答案是O(n^2):
这个循环:
for(int i =1; i<n;i=i*2)
将在 1、2、4、8、... 中以 i
执行其主体,直到(但不包括)i = n
。所以它将执行它的主体 O(log n
) 次。
这个循环:
for(int j=1; j<i; j = j*2)
将在 1、2、4、8、... 中以 j
执行其主体,直到(但不包括)i = j
。所以它会执行它的主体 O(log(j)
) 次。因为 j < n
, O(log j
) < O(log n
), 所以我们也可以说 j
循环是 O(log n
).
我们已经确定 i
循环执行了 j
循环的 O(log n
) 次执行,而 j
循环执行了 O(log n
) 执行其主体。因此,我们乘以因子得到 O(log n
) * O(log n
) = O(log n * log n
) = O(log² n
) j
循环体。
注意log² n
是数学家的写法(log n)²
。 与log log n
不同。
明天我们有期中考试,我们不能解决这段代码的大O符号:
for(int i =1; i<n;i=i*2)
{
for(int j=1; j<i; j = j*2)
{
cout << "hello";
}
}
我们认为它可以是“log(log(n))”,但事实并非如此。
如果我们做一个图形table,我们可以看到答案是O(n^2):
这个循环:
for(int i =1; i<n;i=i*2)
将在 1、2、4、8、... 中以 i
执行其主体,直到(但不包括)i = n
。所以它将执行它的主体 O(log n
) 次。
这个循环:
for(int j=1; j<i; j = j*2)
将在 1、2、4、8、... 中以 j
执行其主体,直到(但不包括)i = j
。所以它会执行它的主体 O(log(j)
) 次。因为 j < n
, O(log j
) < O(log n
), 所以我们也可以说 j
循环是 O(log n
).
我们已经确定 i
循环执行了 j
循环的 O(log n
) 次执行,而 j
循环执行了 O(log n
) 执行其主体。因此,我们乘以因子得到 O(log n
) * O(log n
) = O(log n * log n
) = O(log² n
) j
循环体。
注意log² n
是数学家的写法(log n)²
。 与log log n
不同。