我正在努力研究即将进行的有关Big-O表示法的测验。我在这里有一些例子,但他们给我带来了麻烦。对于您在网上找到的许多基本示例来说,它们似乎有点过于先进。以下是我遇到的问题。
1. `for (i = 1; i <= n/2; i = i * 2) {
sum = sum + product;
for (j= 1; j < i*i*i; j = j + 2) {
sum++;
product += sum;
}
}`
对于这个,外部循环中的i = i * 2
意味着O(log(n)),并且我认为i <= n/2
条件不会改变任何东西,因为我们忽略了常量。所以外循环保持O(log(n))。内循环条件j < i*i*i
使我感到困惑,因为它的'i'而不是'n'。那个内环的Big-O会是O(i ^ 3)吗?因此整个问题的Big-O
是O((i ^ 3)* log(n))?
2. `for (i = n; i >= 1; i = i /2) {
sum = sum + product
for (j = 1; j < i*i; j = j + 2) {
sum ++;
for (k = 1 ; k < i*i*j; k++)
product *= i * j;
}
}`
对于这个,最外层循环意味着O(log(n))。中间循环暗示,再次不确定,O(i ^ 2)?最内层的循环意味着O(i ^ 2 * j)?我以前从未见过这样的例子所以我几乎猜到了这一点。这个问题的Big-O符号是O(i ^ 4 * n * j)吗?
3. `for (i = 1; i < n*n; i = i*2) {
for (j = 0; j < i*i; j++) {
sum ++;
for (k = i*j; k > 0; k = k - 2)
product *= i * j;
}
}`
这个最外层的循环有一个n ^ 2条件,但也是一个对数增量,所以我认为取消只是常规的O(n)。中间循环是O(i ^ 2),最里面的循环我认为只是O(n)并试图欺骗你。所以对于这个问题,Big-O表示法将是O(n ^ 2 * i ^ 2)?
4. `int i = 1, j = 2;
while (i <= n) {
sum += 1;
i = i * j;
j = j * 2;
}`
For this one I did a few iterations to better see what was happening:
i = 1, j = 2
i = 2, j = 4
i = 8, j = 8
i = 64, j = 16
i = 1024, j = 32
很明显,'我'变得非常快,因此很快就能满足这个条件。但是我不确定这是什么样的Big-O符号。
非常感谢您提供的任何指示或提示,谢谢你们。
答案 0 :(得分:0)
您不能将i或j添加到O符号,它必须转换为n。
第一个:
设k为log 2 i。
然后对于外循环的每次迭代,内循环完成2 ^(k * 3)/ 2 = 2 ^(3k-1)次。
k从1变为log2n。 所以迭代的总数是 根据Wolfram Alpha,为0(n ^ 3),k从1到log 2 n的总和为2 ^(3k-1),即4/7(n ^ 3-1)。
对于最后一个,i = j1 * j2 * j3 * ... jk,jm = 2 ^ m
i = 2 ^ 1 * 2 ^ 2 * ... 2 ^ k = 2 ^(1 + 2 + ... k)
所以1 + 2 + 3 + ... + k = log 2 n
(k + 1)k / 2 = log 2 n
哪个是O(sqrt(log n))
BTW,log n ^ 2不是n。 这个问题在计算机科学问题上比在这里要好。