【问题标题】:Perform operation on multiple arraylists efficiently in Java在 Java 中高效地对多个数组列表执行操作
【发布时间】:2014-11-04 02:39:58
【问题描述】:

我在 ArrayList 中有双精度数的 ArrayList。所以它是这样的

ArrayList<ArrayList<Double>> x = new ArrayList<ArrayList<Double>>();

我的x 中有 19 个 ArrayList。我有一个名为distance(ArrayList x, ArrayList y) 的方法,它计算ArrayLists xy 之间的距离 并返回double。我想计算每个向量与所有其他向量之间的距离。

我的方法是这样做

for(int i=0 ; i<(x.size()-1) ; i++)
    {
        for(int j=(i+1) ; j<x.size() ; j++)
        {
            System.out.println(distance( x.get(i) , x.get(j) ));
        }
    }

但是,它看起来效率不高。效率为 O(N^2)。 效率对我来说非常重要。我需要帮助找出执行此操作的最有效方法。

【问题讨论】:

  • 您无法避免 O(N^2),因为您正在生成 N^2 个输出值。
  • 在 Java 8 中可以使用并行流处理。
  • @PM77-1:除非你的核心数量是 N 的函数,否则这对你没有帮助(复杂性方面)。
  • 虽然您无法避免 O(n^2) 取决于您对列表所做的操作,但您可以存储该距离列表并使用运行速度更快的方法对其进行更新。但这取决于您的应用程序
  • @Matin:从算法复杂性的角度来看,没有。从务实的角度来看,也许是的。但首先它在很大程度上取决于distance 的数学特性。 (具体来说,dist(x,y)dist(y,z) 是否告诉您有关 dist(x,z) 的任何信息?)

标签: java performance arraylist


【解决方案1】:

如果性能影响来自distance(x,y) 的算法并且无论如何您都无法对其进行优化,为什么不尝试缓存给定对 (x,y) 的距离结果呢?如果你这样做,请考虑distance(x,y) == distance(y,x)的情况。

此外,预先计算 x.size() 并存储它可能会为您节省一些处理时间。

【讨论】:

  • 缓存有什么帮助?每对只被认为一次。
  • 我不太明白你说的缓存是什么意思
  • @OliverCharlesworth “每一对都被认为是一次”原始问题中没有提到。
  • @Matin 如果您正在寻找优化 for 循环,Oliver Charlesworth 已经回答了。但是,据我所知,for 循环并不是主要的性能损失,而是您在每次迭代中所做的事情是性能下降的主要原因。所以这个想法不是减少迭代次数。如果所有向量的组合可能包含重复的 (x,y) 对并且 distance 方法非常复杂,您可能希望将 distance(x,y) 的结果存储在字典中以备后用。这将帮助您提高性能。
  • @MarbleDaemon:是的。看看循环结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多