【问题标题】:Which is the most efficient way of comparing large number of value which are stored in array?比较存储在数组中的大量值的最有效方法是什么?
【发布时间】:2016-05-26 10:06:02
【问题描述】:

我在 Java 的数组中存储了数千个值。我想将每个值与数组中的每个其他值进行比较。

目前我正在使用两个嵌套循环进行比较。这种方法会导致堆空间内存错误。

以下是我目前正在使用的代码:

for(int i=0; i<arr.size(); i++)
{
    for(int j=i+1; j<arr.size(); j++)
    {
        //CODE FOR COMPARING arr[i] and arr[j]
        //performing some more operations here which contain loops and functions
    }
}

比较如此大量的数据,哪种方法最有效?

编辑: 我正在使用 Eclipse 执行此操作。

ArrayList 是字符串类型。

我正在使用“.equals”进行比较

我还在循环中执行了一些更多的操作,这需要更多的内存。

我什至尝试在循环中放置一个打印计数,以了解循环执行了多少次。它已经执行了超过 32K 次。

【问题讨论】:

  • 这取决于你要比较什么,以及arr的类型是什么。
  • 另外,您要比较相等 (==) 还是比较哪个更大?
  • 这如何使用比原始数组更多的内存?
  • 起始数组是否有任何特殊属性,例如排序?

标签: java arrays algorithm data-structures


【解决方案1】:

根据你的类型,你可以

  • 对数组进行排序并使用二进制排序O(N log N)
  • 将元素添加到 HashMap 并查找任何匹配项 O(N),但这取决于您对这些值执行的操作。

Java 8 的一个好的模式是使用 groupingBy 或 reduction。

Map<String, List<MyType>> map = Stream.of(arr)
                               .collect(Collectors.groupingBy(mt -> mt.getKey()));

它的作用是将所有条目与同一个键组合起来。您可以选择适合您比较的键。这会将具有相同键的所有条目组合到一个集合中,然后您只需要匹配具有相同键的条目。这个 groupingBy 需要O(n)

【讨论】:

    【解决方案2】:

    我想你的记忆结束了,因为你分配了太大的数组。因此,您可以在读取值时将值插入 HashMap 中,从而避免重复输入,并且可以节省内存。添加到 HashMap 需要 O(1) 时间,并且在已插入此元素时会返回 false。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多