0

谁能帮我找出以下两个中哪一个更有效和正确?

1.

for(int i = num; i * i <= n; i++)

2.

int root = sqrt(n);
for(int i = num; i <= root; i++)

在第一种方法中,我们在每次循环运行时计算 i 的平方。我们也不能预先计算 i 的平方,因为 i 每次都会更新。

在第二种方法中,我们不是每次都计算 sqrt(n)。这是节省时间吗?

即使对于大数字(如 10^6),第二个循环是否会以 100% 准确的结果更快地工作?


第二种情况应该更有效,因为不需要为循环中的每次迭代计算循环限制器,这是有道理的。尝试使用下面给出的代码测量通过 2 种类型的 for 循环所使用的 CPU 时间。对于较小的数字(例如 n = 25),对于第一种情况,看起来 cpu 时间实际上更短。但是对于 n>=100 的值,第二种情况会提供更短的 cpu 时间。

    clock_t start,end;
    double cpu_time_used;
    double n, root;

    n = atoi(argv[1]);
    printf("n= %0f \n",n);
    start = clock();
    for (int i=0; i*i<n; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("first iter: cpu_time_used: %f \n", cpu_time_used);

    start = clock();
    root = sqrt(n);
    for (int i=0; i<=root; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("second iter: cpu_time_used: %f \n", cpu_time_used);

输出:

n= 25.000000 
first iter: cpu_time_used: 0.000004 
second iter: cpu_time_used: 0.000011 

n= 100.000000 
first iter: cpu_time_used: 0.000002 
second iter: cpu_time_used: 0.000001 

n= 1000000.000000 
first iter: cpu_time_used: 0.000011 
second iter: cpu_time_used: 0.000008 
4

1 回答 1

0

第二种情况应该更有效,因为不需要为循环中的每次迭代计算循环限制器,这是有道理的。尝试使用下面给出的代码测量通过 2 种类型的 for 循环所使用的 CPU 时间。对于较小的数字(例如 n = 25),对于第一种情况,看起来 cpu 时间实际上更短。但是对于 n>=100 的值,第二种情况会提供更短的 cpu 时间。

    clock_t start,end;
    double cpu_time_used;
    double n, root;

    n = atoi(argv[1]);
    printf("n= %0f \n",n);
    start = clock();
    for (int i=0; i*i<n; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("first iter: cpu_time_used: %f \n", cpu_time_used);

    start = clock();
    root = sqrt(n);
    for (int i=0; i<=root; i++);
    end = clock();
    cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
    printf("second iter: cpu_time_used: %f \n", cpu_time_used);

输出:

n= 25.000000 
first iter: cpu_time_used: 0.000004 
second iter: cpu_time_used: 0.000011 

n= 100.000000 
first iter: cpu_time_used: 0.000002 
second iter: cpu_time_used: 0.000001 

n= 1000000.000000 
first iter: cpu_time_used: 0.000011 
second iter: cpu_time_used: 0.000008 
于 2020-03-26T08:08:38.070 回答