【发布时间】:2014-12-07 01:14:03
【问题描述】:
在一组变量中找到最大值的最有效方法是什么?
我看到了解决方案,such as
private double findMax(double... vals) {
double max = Double.NEGATIVE_INFINITY;
for (double d : vals) {
if (d > max) max = d;
}
return max;
}
但是,最有效的算法是什么?
【问题讨论】:
-
嗯似乎是个好问题。因为我认为您总是需要遍历集合中的所有值,所以我会将其简化为“找到最快的方法来做
if (d>max) max=d -
就运行时和 Big-O 表示法而言,您必须至少触摸/加载和比较每个元素一次。您的算法正是这样做的,所以如果复杂性来自加载或比较,它似乎是最佳的。保持语言独立我会说在许多情况下并行化可能会有所帮助,即在 GPU 上,并行缩减操作是有效的。我认为其他一切都取决于语言和/或硬件(编译器)。
-
保持集合排序并返回最后一项。
-
@rupps :使用例如OpenMP >3.1 你可以通过在
for-loop 之前添加#pragma omp parallel for reduction(max : max)来做到这一点。其中第二个最大值指的是double max。它会自动穿过管道。 -
通过设置变量 double max = vals[0]; 可以实现边际性能提升,即设置为第一个值并从第二个值开始循环;它应该适用于任何实际实现(C、C# 等)。
标签: performance algorithm language-agnostic max double-precision