检查是否为素数大

时间:2017-08-12 23:06:13

标签: c++ big-o asymptotic-complexity

我确定数字是否为素数的原始函数是:

bool is_prime(int x) {
    for (int y = 2; y < x; ++y) {
        if (x % y == 0) {
            return false;
        }
    }
    return true;
}

这种情况的复杂程度为O(x),因为您可能不得不转到x

我已经了解了一些优化,需要检查一下我的大人物。以下是改进的计划:

bool is_prime(int x)
{   
    if (x % 2  == 0 && x > 2) {
        return false;
    }
    for (int y = 3; y*y <= x; y += 2) {
        if (x % y == 0) {
            return false;
        }
    }
    return true;
}

我现在是否正在sqrt()将此更改为O(sqrt(x))

2 个答案:

答案 0 :(得分:7)

是的,但这里没有n。新功能的复杂性为 O(sqrt(x))。如果您说 O(N)并且未指定 N 是什么,则通常将其视为输入的大小。对于采用单个数字参数的函数而言,这会让人感到困惑,因此在这些情况下,您应该是明确的。

答案 1 :(得分:1)

绝对, 新功能的复杂性是

  

O(SQRT(X))

但是,仍有一些优化空间。看看下面提到的代码:

bool isPrime(int n)
{
    // Boundary cases
    if (n <= 1)  return false;
    if (n <= 3)  return true;

    // This is checked so that we can skip 
    // middle five numbers in below loop
    if (n%2 == 0 || n%3 == 0) return false;

    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
           return false;

    return true;
}