如何有效地排序一百万个元素?

时间:2015-07-08 13:52:59

标签: java performance sorting arraylist

我需要将大约60.000与935.000元素的列表进行比较,如果它们匹配,我需要进行计算。

我已经实现了所需的一切,但这个过程大约需要40分钟。我在两个列表中都有一个唯一的7位数字。 935.000和60.000文件未分类。在尝试查找元素之前,排序(哪种排序?)大列表是否更有效?请记住,我必须每月只进行一次计算,因此我不需要每天重复此过程。

基本上更快:

  • 未排序的线性搜索
  • 首先排序列表,然后使用其他算法进行搜索

4 个答案:

答案 0 :(得分:3)

试一试。

你有Collections.sort()这将为你做繁重的工作,Collections.binarySearch()将允许你找到排序列表中的元素。

答案 1 :(得分:1)

哪种方法可以很好地对两个列表进行排序,然后同时迭代这两个列表。

使用collections.sort()对列表进行排序。

你从每个排序列表的索引开始,基本上直接走过它。您从短列表中的第一个元素开始,并将其与长列表的第一个元素进行比较。如果您到达长列表中的元素的数字比短列表中的当前数字高7位数,请增加短列表的索引。这样就不需要两次检查元素了。

但实际上,由于你想找到两个列表的交集,你可能最好只使用longList.retainAll(shortList)来获得两个列表的交集。然后你可以在大约O(1)的两个列表上执行你想要的任何事情,因为不需要实际找到任何东西。

答案 2 :(得分:1)

当您搜索未排序的列表时,在找到您要查找的元素之前,您必须平均查看一半的元素。当你在935,000个元素的列表上执行60,000次时,这大约是

935,000 * 1/2 * 60,000 = 28,050,000,000次操作

如果您首先对列表进行排序(使用mergesort),则需要执行n * log(n)次操作。然后,您可以使用二进制搜索在短信列表中的每个60,000个元素的log(n)查找中查找元素。那是关于

935,000 * log(935,000)+ log(935,000)* 60,000 = 19,735,434次操作

如果首先对列表进行排序,然后使用利用排序列表的搜索算法,它应该快得多。

答案 3 :(得分:1)

您可以根据需要对两个列表进行排序并逐个元素地增加第一个或第二个索引(下例中的ij)进行比较:

List<Comparable> first = ....
List<Comparable> second = ...
Collections.sort(first);
Collections.sort(second);

int i = 0;
int j = 0;
while (i < first.size() && j < second.size()) {
    if (first.get(i).compareTo(second.get(j)) == 0) {
        // Action for equals
    }
    if (first.get(i).compareTo(second.get(j)) > 0) {
        j++;
    } else {
        i++;
    }
}

此代码的复杂性为O(n log(n)),其中n是最大的列表大小。