在尝试比较两个代码的速度时,时间复杂度是唯一要考虑的事情吗?

问题描述

最近,我编写了一个代码,用于查找C语言中“ int”数据类型范围内的数字的质因数。当我向我的朋友展示时,他告诉我,有更多优化的方法具有O(sqrt(n )),O(log(n))。当我运行时间复杂度为O(sqrt(n))的代码,并在Dev C ++上运行我的代码时,我发现这两个代码所花费的总时间几乎相同。我的代码的时间复杂度是多少?

#include <stdio.h>
int main(void)
{
    int k = 2,n,m;
    printf("enter a +ve integer greater than 1:- ");
    scanf("%d",&n);
    m = n;
    do {
        if (n % k == 0) {
            n /= k;
            printf("%d,",k);
        }
        if (n == 1)
            break;
        while (n % k != 0) {
            if (k == 2)
                k = 3;
            else
                k += 2;
        }
    } while (n % k == 0);
    printf("prime factors of %d\n.",m);
    return 0;
}

解决方法

时间复杂度分析是出于大N 的考虑。如果您还没有感觉到效果,则您的N不够大。我将%d更改为%lld,将int更改为long long int,并考虑了欧拉发现的梅森素数的平方,即(2³¹-1)²。>

结果:

% echo 4611686014132420609 | time ./a.out
enter a +ve integer greater than 1:- 2147483647,2147483647,prime factors of 4611686014132420609
../a.out  12.15s user 0.00s system 99% cpu 12.154 total
% echo 4611686014132420609 | time factor
4611686014132420609: 2147483647 2147483647
factor  0.00s user 0.00s system 87% cpu 0.001 total

即即使使用GCC和-O3进行编译,您的程序也需要比factor程序大至少12000倍的CPU能力来分解数字。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...