检查素数 big-o

Check if prime big-o

我确定一个数是否为质数的原始函数是:

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

这个 运行 的复杂度为 O(x),因为您可能不得不去 x

我了解了一些优化,需要检查一下我的 big-o。这是改进后的程序:

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))

是的,但这里没有 n。新函数的复杂度为 O(sqrt(x))。当你说 O(N) 并且不指定 N 是什么时,它通常被认为是 size 的输入。这对于采用单个数字参数的函数来说是令人困惑的,因此在这些情况下你应该明确。

当然, 你的新函数的复杂度是

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;
}