【问题标题】:Is there a way to optimize this C program in terms of run time有没有办法在运行时间方面优化这个 C 程序
【发布时间】:2018-03-12 15:13:29
【问题描述】:

它的目标是打印直到第 93 个的所有斐波那契数

#include<stdio.h>

void main(){
  unsigned long long first=0,second=1,sum;
  printf("%llu,%llu",first,second);
  unsigned char hops=1;
  while (hops<93) {
    sum=first+second;
    printf(",%llu",sum);
    first=second;
    second=sum;
    hops++;
  }
  printf("\n");
}

【问题讨论】:

  • 这对 codereview SE 有效吗?我认为,当然不适合 SO。
  • 我认为这个话题太宽泛了。 “优化速度”不是问题。询问一个具体的优化概念,也许是某个阻碍进展的细节,这可能是一个足够具体的问题。
  • 这需要运行多快?整数运算的 92 次迭代根本不会花费很长时间。
  • @squeamishossifrage 猜测这是一个“不合理的要求”,有时也称为“用于教学目的的奇怪要求”,即家庭作业或编码挑战。
  • 这确实是一个很好的实现(就时间和空间复杂度而言)。这里没有太多可优化的地方。

标签: c linux performance performance-testing


【解决方案1】:

当然可以。只需打印预先计算的数字字符串。

#include <stdio.h>
int main()
{
    puts("0,1,1,2,3,5,...");
    return 0;
}

【讨论】:

  • 我认为这是我将得到的最佳答案
  • @user8062843 如果它满足您的需求 - 是的。
  • @user8062843 如果你想得到另一个东西那么你的问题是不正确的(你应该概括你的问题)。
  • @giusti 你快乐吗? :-)
  • @LeeDanielCrocker 是的,你是对的。该程序几乎一直在 IO 中运行。我们不能优化 IO 本身,只能优化它的请求数。但是作者可以把他的任务改成没有IO的任务。例如,创建斐波那契数列。我的观点是,他的任务不依赖于任何东西,因此可以预先计算结果。
【解决方案2】:

如果您需要优化整个操作,您需要考虑空间和时间复杂度。从这一点开始,您可以想象这些会变得多么好。

现在打印n 数字当然需要迭代,其时间复杂度为O(n)。有没有更好的方法来做到这一点?问题是,如果你多次这样做,你可以通过将它存储在某个地方来摆脱添加。但这不会给你任何更好的渐近时间复杂度改进——而是你将面临O(n) 空间复杂度——如果打印只是你做的事情,这将是一个开销。 (当然必须进行预计算)。

所以是的,这个解决方案足以实现您想要做的事情。

如果您需要扫描某些输入 - 那么我会要求您使用 getchar 获取输入,然后从中形成数字(如果需要)。如果您在 SPOJ 或竞争性编程裁判服务器中考虑这一点,这些往往会提供更好的结果。 (在大量输入案例中,时间再次小于scanf - 10^7 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多