【问题标题】:How to optimize this piece of code? [Processing inside nested for loops]如何优化这段代码? [在嵌套的 for 循环中处理]
【发布时间】:2016-10-14 20:33:53
【问题描述】:
for (int i = 0,len=size-2; i < len; i++) {
            for (int j = 1,leng = size-1; j < leng; j++) {
                for (int k = 2; k < size; k++) {
                    if (i < j && j < k) {
                        sum = sum + Math.floor((a[i] + a[j] + a[k]) /    (a[i] * a[j] * a[k]));
                    }

                }
            }
        }

我需要这段代码至少在当前运行时间的一半内运行。这里,数组“a”是双精度类型。我正在通过阅读器类进行输入。如何实现更快的运行时间?

【问题讨论】:

  • 你想用这段代码完成什么?
  • @MichaelPickett 我必须对数组的三元组进行求和。代码正在做它的工作。我只需要至少一半的运行时间。
  • 在我看来,这段代码多次执行相同的操作。最值得注意的是,每个 i 循环将 jk 减去 1 个位置。
  • @MichaelPickett 我不明白。能详细点吗?
  • @Treycos 数组中有 N 个元素。我必须对三元组 x,y,z 求和,使得 0

标签: java performance optimization runtime


【解决方案1】:

除非满足条件i &lt; j &amp;&amp; j &lt; k,否则您的嵌套循环只会进行迭代。但是中间循环和内循环每次都以相同的初始值开始迭代,而不管外循环索引的值如何。例如,当i5 时,中间循环仍然从1 开始,而内部循环仍然从2 开始,尽管他们可以知道他们不会执行任何对这些价值观有用的工作。

从更有用的点开始迭代每个循环。您将节省许多无用的索引算术和许多徒劳的索引比较。事实上,如果你做得好,那么你根本不需要执行任何索引比较。

细节,例如它们,留作练习。我可能已经提供了太多帮助。

【讨论】:

  • 是的,你有。非常感谢你。 :)
【解决方案2】:

您可以将1/(x*y*z)重写为1*(1/x)*(1/y)*(1/z)。乘法比除法快。您可以将倒数数组预先计算为ra[i] = 1/a[i]。可以进一步优化,但这取决于可以有什么值,你没有回答那个问题。

【讨论】:

    【解决方案3】:

    使用此代码将不再需要 if 语句: x 总是低于 y 总是低于 z

    for (int x = 0; x < size - 2; x++)
        for(int y = x + 1; y < size - 1; y++)
            for(int z = y + 1; z < size; z++)
                sum += Math.floor((a[x] + a[y] + a[z]) / (a[x] * a[y] * a[z]));
    

    【讨论】:

    • 谢谢。但不幸的是,这在运行时没有任何变化。
    • Math.floor() 中的操作可能会占用 99% 的运行时间,这是您唯一可以改进的地方
    • 我看不到其他方式:(
    • Mhm... 为什么需要 Math.floor()?,尝试不使用它并检查执行时间以查看是否是 pb
    • 问题是楼层算子是求和函数的一部分。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多