C++ 该素性检验函数的时间复杂度

C++ 该素性检验函数的时间复杂度,c++,time-complexity,big-o,primality-test,C++,Time Complexity,Big O,Primality Test,这个函数的时间复杂度是多少 bool prime(int n) { if(n <= 1) { return false; } else if(n <= 3) { return true; } else if(n % 2 == 0 || n % 3 == 0) { return false; } else { for(int i = 5; i * i <= n; i += 6) {

这个函数的时间复杂度是多少

bool prime(int n) {
    if(n <= 1) {
        return false;
    } else if(n <= 3) {
        return true;
    } else if(n % 2 == 0 || n % 3 == 0) {
        return false;
    } else {
        for(int i = 5; i * i <= n; i += 6) {
            if(n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
    }
    return true;
}

每个if都是恒定时间

for
循环执行直到
i*i
达到
n
这意味着它执行
sqrt(n)/6次。所以复杂性是
O(sqrt(n))

质数的密度与
1/log(n)
成正比(这可能是解决方案中
log(n)
的来源)

注意,时间复杂性(无形容词)通常被认为是最坏的时间复杂度:

由于算法的运行时间在相同大小的不同输入之间可能会有所不同,人们通常会考虑,这是给定大小的输入所需的最大时间量


在这种情况下,平均时间复杂度的计算要困难得多。你必须证明当
n
不是质数时,循环的平均终止速度有多快。

我有一个印象,它是O(n)?但仅仅for循环最多需要O(sqrt(n)),我认为损失界是O(sqrt(n)),而更紧的界是O(sqrt(n)*1/6)。不是专家,可能完全错了。请问日志是从哪里来的?@MarkRansom一旦知道,很容易证明;)但是如果它是
O(sqrt(n))
如果我将int改为long-longs,而我的n是
1020100101111191
,它运行得非常快。计算机平均每秒钟运行大约10^8次操作。这个数字有16位长,应该在1秒左右运行,但它几乎立即运行,并告诉我它是一个素数。素数的密度很重要:当
返回false时路径时,for
循环的
提前退出,降低了时间复杂度。您可以调用
O(sqrt(n))
最坏情况复杂度,但我认为它不是有效的平均时间复杂度。@Jeffrey复杂度总是针对最坏情况计算的。所以在这种情况下,
n
是素数。请注意,表示法
O
表示渐近复杂性,但不慢于此。肯定不总是如此。在素数测试的情况下,当你知道大多数情况不会是最坏的情况时,考虑一般情况是有意义的。
O(sqrt(log(n)))