【问题标题】:For Loops Code OptimizationFor 循环代码优化
【发布时间】:2011-10-12 04:58:40
【问题描述】:

我遇到了一个挑战,即使用 for 循环以最简单的方式打印出 7 的倍数(非负数)到第 50 个倍数。

我想出了这个(忽略数据类型)

for(int i = 0; i <= 350; i += 7)
         {System.out.println(i);}

另一个人想出了这个

for(int i=0;i <=50; i++)
{
System.out.println(7*i);
}

不过,我觉得sn-ps这两个代码还可以进一步优化。如果真的可以请告诉。一个比另一个有什么优点/缺点?

【问题讨论】:

  • 你想优化这个?输出部分将花费大约 99.99% 的时间,而实际的数学运算花费的时间太少,甚至连想是否优化它的想法都没有,更不用说如何优化了。等到你证悟,意识到所有这些,甚至更多你不应该担心的理由时,你已经花费了无数次的时间来进行这些计算,成千上万次。浪费时间的方式;)
  • 有 for(int i=0; i
  • 最快的执行是展开循环并打印每个数字:System.out.println("0"); System.out.println("7"); System.out.println("14"); ...。但是你在挑战的前提下排除了这一点。 :-P 但是,“人类最简单的方法”可能意味着许多不同的事情;我的意思是“最容易维护”和/或“通过查看代码最容易理解正在发生的事情”,而不是“最快”。
  • @delnan:我可以找到我第一次听到“理发减肥”的评论。

标签: java optimization loops


【解决方案1】:

如果你真的想优化它,这样做:

System.out.print("0\n7\n14\n21\n28\n35\n42\n49\n56\n63\n70\n77\n84\n91\n98\n105\n112\n119\n126\n133\n140\n147\n154\n161\n168\n175\n182\n189\n196\n203\n210\n217\n224\n231\n238\n245\n252\n259\n266\n273\n280\n287\n294\n301\n308\n315\n322\n329\n336\n343\n350");

它是O(1) :)

【讨论】:

  • ++ 更快的方法是将结果保存在文件中,只需cat 即可。
【解决方案2】:

第一个在技术上执行较少的操作(没有乘法)。

第二个更易读(7 的 50 个倍数与 7 的倍数到 350)。

可能无法进一步优化。

除非您愿意通过以下方式优化多个println 调用:

StringBuilder s = new StringBuilder();

for(int i = 0; i <= 350; i += 7) s.append(i).append(", ");

System.out.println(s.toString());

(IIRC printlns 相对昂贵。)

这已经到了以牺牲简单性为代价获得一点点优化的地步。

【讨论】:

  • 但是i++i+7 快。
  • @fastcodejava:说谁?即使是疯狂的多次迭代,你能测量出差异吗?
  • @fastcodejava - 你怎么知道i++ 总是比i+7 快?
  • 但是CPU的乘法基本都是加法??
  • @fastcodejava: 做i++ 然后i*7 几乎肯定比只做i+=7 更昂贵。
【解决方案3】:

理论上,您的代码更快,因为每个循环不需要少一条乘法指令。

但是,对System.out.println 的多次调用(以及整数到字符串的转换)将缩短乘法所需的运行时间。要进行优化,请将字符串与StringBuilder 聚合并输出整个结果(或在内存出现问题时输出结果)。

但是,在实际代码中,这不太可能成为瓶颈。 配置文件,然后优化

【讨论】:

    【解决方案4】:

    第二个函数是你能得到的最好的: O(n)

    【讨论】:

    • @两个函数都是O(n),这里的渐近复杂度常数其实是有意义的。
    • 第一个函数不是O(n)?
    • 我知道它们都是 O(n),第二个使得迭代次数更少,因此更优化。并且在扩展时更加优化
    • 两者的迭代次数完全相同,只是步长不同。
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2020-02-18
    • 2019-05-31
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多