【问题标题】:What's the complexity of this algorithm [duplicate]这个算法的复杂度是多少[重复]
【发布时间】:2016-09-13 02:48:12
【问题描述】:

这个算法的时间复杂度是多少?

void prime(int n) { 
    int i = 2;
    while ((n % i) && i <= sqrt(n))
        i++;

    if (i > sqrt(n))
        print(“%d is a prime number\n”, n);
    else
        print(“%d is not a prime number\n”, n);
}

【问题讨论】:

  • 为什么你认为n 是质数或非质数会改变复杂性?
  • 是的,我知道无论 n 是否为素数,复杂性都不会改变。所以我不知道它的复杂性。
  • 那么你到底在问什么?您的评论与您问题的第一行直接矛盾。
  • 如果将其限制在非质数正整数的域中,则可以保证在较小的因子处提前终止,这可能是(最坏的情况)sqrt(sqrt(n))。所以是的,它会改变。

标签: c++ complexity-theory


【解决方案1】:

复杂度约为 O(sqrt(N))。有些书会将其表示为 O(N0.5)。

每次循环迭代都会重新计算平方根。这是一个相当慢的操作,所以它比最优慢,但只是一个常数因子,所以它不会影响计算复杂度。

【讨论】:

  • 因为它是一个 c++ 固定大小的整数,所以是的。虽然 sqrt 不必是常数,如果它是例如python,或数学库中的大整数类型。
【解决方案2】:

之前我想错了。 嘿,这只是 O(sqrt(n))... 看看 while contion 为除 n 的所有 x

【讨论】:

  • @Vincent_Bryan:: 很抱歉让它像以前那样......现在检查我的答案。它是 sqrt(n)。
  • 我认为 O(sqrt(n)) 是最坏的情况,平均情况是多少?
猜你喜欢
  • 2023-03-07
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多