【发布时间】: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*m在x-1和x之间对于正@ 987654335@)。有有效的算法(复杂度 O(log(x)) 或更好)来计算整数平方根,而无需使用浮点数。 -
@Peter 我最初没有进行浮点转换,但数学表明
m*m可以在这里发挥作用。
标签: c++ big-o asymptotic-complexity