我确定数字是否为素数的原始函数是:
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))
?
答案 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;
}