【问题标题】:What would be the Growth Rate of the following function以下函数的增长率是多少
【发布时间】:2013-03-09 05:25:50
【问题描述】:

就大 O 表示法而言,以下函数的增长率是多少?

f (n) = Comb(1000,n) for n = 0,1,2,…


int Comb(int m, int n)
{
    int pracResult = 1;
    int i;

    if (m > n/2) m = n-m;

    for (i=1; i<= m; i++)
    {
        pracResult *= n-m+i;
        pracResult /= i;
        practicalCounter++;
    }

    return pracResult;

}

递归:

int combRecursive (int m, int n)
{
    recursiveCounter++;
    if (n == m) return 1;
    if (m == 1) return n;
    return combRecursive(n-1, m) + combRecursive(n-1, m-1);

}

我猜n^2???不过我可能错了……我一直在努力弄清楚事情的效率如何……

先谢谢你了。

【问题讨论】:

  • 我收回我的话。如果你写的内容是正确的,那么你的函数在 O(1) 中运行。
  • 需要更多关于 Comb() 的信息
  • 我很抱歉。我会尽快更新问题。
  • 我已经更新了代码。
  • @JLott:您是否 100% 确定您以正确的顺序使用变量 m 和 n?您将 n 作为第二个参数传递,但第一个参数名为 n。

标签: time-complexity big-o


【解决方案1】:

我是O(1)

根据定义,f(n) = O(g(n)) 如果存在c,则对于所有nf(n) &lt;= c*g(n)

c = Comb(1000,500)

对于所有nComb(1000, n) &lt; c * 1。因此Comb(1000, n) = O(1)

【讨论】:

  • 你真的认为这就是她要找的答案吗? :)
  • @Ajeet,我认为这是对所提出问题的答案。令人惊讶的是,人们提出的问题实际上并不期待正确的答案。有时这甚至会导致他们接受错误的答案。这在政治中也经常发生。
  • 我觉得这不可能……这个函数基本上可以找到给定 m 和 n 的组合数。我可以通过我的代码运行方式判断它在第一次运行时找不到它,因为我放了一个计数器。但是,我这样做的方式比递归执行要高效得多。
  • @JLott,您的代码通过该循环m 次,最多n/2。所以肯定不止一次,但总是少于500(仍然是 O(1))。无论如何,我想你想知道你正在做多少计算,而不是函数的值是多少。那是一个不同的问题。即使在那里,你也应该小心不要问有固定限制的问题。
  • @JLott:如果你想对程序的执行时间进行建模,你可能需要考虑数字的大小,因为它们会变得非常大。如果你这样做了,并且你问Comb(n, n/2) 的执行时间是多少,你可能会得到O(n^2),正如你最初建议的那样。
【解决方案2】:

对于 n = 1 到 2000,将有与 n 成比例的操作

对于所有 n > 2000,总操作数是恒定的。

因此函数复杂度为 O (1)

我必须告诉你,你必须读一些书。 :)
Sahni 的数据结构和算法读起来很轻松。 Knuth 的算法非常繁重,但却是最好的。

【讨论】:

  • 是的,我真的很惊讶哈哈。
  • 谢谢,我会调查的 :) 算法从来都不是我的菜。说到他们,我是一个试错型的人哈哈哈。
猜你喜欢
  • 2023-02-10
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多