Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比较数学运算所用的时间_C_Algorithm_Performance_Math_Operation - Fatal编程技术网

C 比较数学运算所用的时间

C 比较数学运算所用的时间,c,algorithm,performance,math,operation,C,Algorithm,Performance,Math,Operation,哪种实现更快(理论上)- long int total=0; 对于(int n=1;n嗯,如果你是从算法的角度来讨论的,那么第一个操作的复杂度要比第二个操作的复杂度高。 第一个操作的复杂度为O(1),其中与第二种情况一样,它将是O(n)。 所以,当输入的数量增加时,第一个输入的时间可能比第二个输入的时间要短。 延迟与执行操作所需的机器指令成正比。您需要做的是显式地编写要比较的两个程序。我想我知道您的意思,但如果您显式地编写它,它将是确定的 假设我对你的意思的猜测是正确的,渐近时间复杂度对这个问题

哪种实现更快(理论上)-

long int total=0;

对于(int n=1;n嗯,如果你是从算法的角度来讨论的,那么第一个操作的复杂度要比第二个操作的复杂度高。 第一个操作的复杂度为O(1),其中与第二种情况一样,它将是O(n)。 所以,当输入的数量增加时,第一个输入的时间可能比第二个输入的时间要短。
延迟与执行操作所需的机器指令成正比。

您需要做的是显式地编写要比较的两个程序。我想我知道您的意思,但如果您显式地编写它,它将是确定的

假设我对你的意思的猜测是正确的,渐近时间复杂度对这个问题没有意义,因为没有自由变量。
n
是“绑定”到循环的。如果你用
M
替换
200000
,那么谈论时间复杂度就有意义了

正如马克·迪金森所指出的,你没有写的两个程序中哪一个的绝对速度更快也是一个框架不好的问题,因为答案很可能取决于上下文。如果我对程序外观的猜测是正确的,那么算术运算的数量似乎是大致相同的uld意味着这些程序运行的时间大致相同,或者可能不一样。我猜时差是难以察觉的,但你为什么不试试呢

最后,如果你要使用捷径
2(1)+2(2)+…+2(n)=n(n+1)
,那么为什么不更进一步,用捷径求
1(2)+2(3)+…+n(n+1)

n(n+1) = (1/3)((n+1)^3 - n^3) - (1/3)
所以

系列是“伸缩”的,所以中间的所有立方项都被取消。得到的表达式可以用5个算术运算来计算。 如果在上面替换n=200000,您将看到

int-total
将溢出32位
int
类型。这是您的意图吗

更新

我在我的系统(MacBookAir/Yosemite)上试用过。我比较过的程序是

#include <stdio.h>

int main() {
  long int total;
  for (int trial=0; trial<1000; ++trial) {
    total = 0;
    for (int i=1; i<=200000; ++i) {
      total = total + i*(i+1);
    }
  }
  printf("answer is %ld", total);
  return 0;
}
#包括
int main(){
长整数合计;

for(int-trial=0;视情况而定!这里的信息几乎不够。您使用的是什么语言?什么体系结构?什么编译选项(假设您使用的是编译语言)
n
的大小是多少?
n
的类型是什么?
n
的连续调用是一起进行的,还是中间有其他代码?还有一千个其他问题……除了“计时并查看”之外,这里真的没有好的答案我建议把这个问题放在不同的论坛上。如果你想通过一些编程来实现这一点,请提及编程语言。否则你可以尝试在这里发布。你可能会在该社区得到更快的响应。对于这个特定的问题,我使用C和1≤N≤2×10^5。它是for循环的一部分,只计算这个结果,其他什么都不计算。如果
n==1
它们甚至没有相同的答案!@chux感谢你注意到了。我在计算中犯了一个错误。它纠正了现在+必须重新框定这个问题。我希望这个问题更清楚,但这是胡说八道。你从哪里得到这个想法的计算的复杂性是,第一个是O(1),第二个是O(n)。我同意。从我的角度来看,这是一个错误。第一个是O(1)。我可能假设了细节,但谢谢你纠正我。它更好,但仍然是错误的。问题表明,第二种方法取决于之前的计算。它只是一步,不是n步,所以它仍然不是O(n)运算。好的。那么,这意味着什么,sum=sum+2*(n+1)对于每个n?由于没有额外的信息,您应该理解,目的是为每个n循环并执行这一条语句。如果您假设了什么,一定要让我知道。我很乐意理解。我想您编写整个程序是对的,它认为如果我在原稿中保持简短会更容易阅读最后一个问题我用了long int。一直以来,我都忍不住想,两个大数字相乘需要更多的时间,而在之前计算的总和上加一些东西需要更少的时间。我错了吗?
n(n+1) = (1/3)((n+1)^3 - n^3) - (1/3)
1(2)+2(3)+...+n(n+1) 
= (1/3)(2^3-1^3) - (1/3) + (1/3)(3^3-2^3) - (1/3) + ... + (1/3)((n+1)^3-n^3) - (1/3)
= ((n+1)^3 - n - 1)/3
#include <stdio.h>

int main() {
  long int total;
  for (int trial=0; trial<1000; ++trial) {
    total = 0;
    for (int i=1; i<=200000; ++i) {
      total = total + i*(i+1);
    }
  }
  printf("answer is %ld", total);
  return 0;
}
#include <stdio.h>

int main() {
  long int total;
  int sum;
  for (int trial=0; trial<1000; ++trial) {
    total = 0;
    sum = 0;
    for (int i=1; i<=200000; ++i) {
      sum = sum + 2*i;
      total = total + sum;
    }
  }
  printf("answer is %ld", total);
  return 0;
}