【问题标题】:Calculating worst case asymptotic running time for multi-function algorithm计算多功能算法的最坏情况渐近运行时间
【发布时间】:2020-09-17 06:01:09
【问题描述】:
int coffee(int n) {
    int s = n * n;
    for (int q = 0; q < n; q++)
        s = s - q;
    for (int q = n; q > 0; q--)
        s = s - q;
    return s + 2;
}

int mocha(int n) {
    int r = 0;
    for (int i=0; i<=n; i = i+16)
        for (int j=0; j<i; j++)
            r++;
    return r;
}

int fun(int n) {
    int j=0;
    for (int k = 16; coffee(k) * mocha(k) - k <= n; k+=16) {
        j++;
        cout << "I am having so much fun with asymptotics!" << endl;
    }
    return j;
}
  1. 如何计算“有趣”函数的最坏情况渐近运行时间? 我确定咖啡的运行时间为 $\Theta(n)$,而 mocha 的运行时间为 $\Theta(n^2)$ 但是我该去哪里呢?

  2. 计算函数的返回值。假设 n>2 ,并且 n 是一个完美的正方形。 我有点不确定从哪里开始回答这个问题。

【问题讨论】:

    标签: java runtime complexity-theory


    【解决方案1】:

    在我们分析您的算法的运行时间复杂度之前,在渐近分析(参考:12)上下文中需要注意的一点是 O(f(n)) 表示最坏情况(上限)和不是 Θ(f(n))。

    您已经正确地提到了最坏情况的渐近运行时间 O(n) 代表 coffeeO(n<sup>2</sup>) 代表 mocha 其中 n 是各个函数的输入大小。

    现在,查看您的多功能算法,很明显函数fun 是输入n 的入口点。 fun 循环通过 n(使用 k),因此此代码块的最坏情况下运行时间复杂度为 O(n)

    for (int k = 16; /* coffee(k) * mocha(k) */ - k <= n; k+=16) {
        j++;
        cout << "I am having so much fun with asymptotics!" << endl;
    }
    

    对于kcoffeemocha 的每个值,它们将被调用n/16 次,总体上是O(n)。因此,以下是为函数fun 正确计算最坏情况渐近运行时间的逻辑:

    O(fun) = O( O(n/16) * ( O(coffee) + O(mocha) ) )
           = O( O(n/16) * ( O(n) + O(n^2) ) )
           = O( O(n^2 / 16) + O(n^3 / 16) )
           ≃ O(n^3)
    

    O( O(n<sup>2</sup>/16) + O(n<sup>3</sup>/16) ) 可以简化为O(n<sup>3</sup>),因为n<sup>3</sup> 是公式n<sup>2</sup>/16 + n<sup>3</sup>/16 中的关键因素。

    【讨论】:

    • 非常感谢!这真的帮助我更多地了解了这些奇怪的渐近复杂性问题。您对问题的第二部分有任何见解:在给定 n 的条件下计算返回值(fun(n) 的表达式)?
    • @KennyCheng,我不太明白你的第二点问题。这似乎是一个实际的实现/逻辑相关问题。如果是这种情况,您将需要用您喜欢的语言编写工作代码,并使用各种输入值调用fun。我相信,你已经意识到了这一点。如果您对逻辑有疑问/疑问,请详细说明您的逻辑/算法的要求。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多