非线性逼近n时的时间复杂度

时间:2016-05-15 08:21:02

标签: algorithm time-complexity

我有一个简单的问题:

金字塔的顶层必须包含1个立方体,第二个层必须包含1 + 2 = 3个立方体,第三个层必须包含1 + 2 + 3 = 6个立方体,依此类推。因此,金字塔的第i层必须有1 + 2 + ... +(i - 1)+ i立方体。

给定n个立方体可能的最大高度是多少。

我很容易编码以下解决方案并通过了:

int main()
{
    int i,sum,n;

    cin >> n;

    i = 1;
    sum = 0;
    while(sum <= n)
    {
        sum = sum + (i*(i+1))/2;
        i++;
    }
    cout << i-2;
    return 0;
}

但是,我对这个解决方案的复杂性并不十分自信。应该是O(log n)还是别的。我问similar question,我也有同样的困惑。任何人都可以在这种情况下解释一些简短的一般理论,以便它涵盖所有这些情景。或者链接到一些好的教程将非常有用

1 个答案:

答案 0 :(得分:0)

你找到了最大的k,使得和(i(i + 1)/ 2代表i = 1..k)&lt; = n。

总和是Theta(k ^ 3)(见https://en.wikipedia.org/wiki/Pyramidal_number),所以最大的k将是Theta(n ^(1/3))。

由于你的循环迭代k次,代码是Theta(n ^(1/3))。