【问题标题】:Check if prime big-o检查素数大o
【发布时间】:2017-08-12 23:06:12
【问题描述】:

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

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

【问题讨论】:

  • @MattTimmermans 同意你和 AndyG 的建议。我用x 编写了函数,所以它应该是x 而不是n
  • 另一种优化是预先计算x 的整数平方根(即找到一个整数m,这样m*mx-1x 之间对于正@ 987654335@)。有有效的算法(复杂度 O(log(x)) 或更好)来计算整数平方根,而无需使用浮点数。
  • @Peter 我最初没有进行浮点转换,但数学表明m*m 可以在这里发挥作用。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当然, 您的新功能的复杂性是

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

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多