麻烦搞清楚这些艰难的Big-O例子

时间:2015-09-30 01:55:29

标签: algorithm loops big-o

我正在努力研究即将进行的有关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符号。

非常感谢您提供的任何指示或提示,谢谢你们。

1 个答案:

答案 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。 这个问题在计算机科学问题上比在这里要好。