列表中的对

时间:2014-03-19 13:03:36

标签: java algorithm

在Java中查找列表中所有数字的唯一对的最佳方法是什么?我有一个解决方案,我将列表转换为数组,然后基本上将第一个元素与第2个元素配对,然后首先与第3个元素配对,依此类推。但是,事实证明这是O(n ^ 2)。 这是我的基本伪代码:

int arr[] = convertListToArray(arrList) 
   for i=1;i< arr.length; i++
     for j =1+1; j<arr.length; j++
          print arr[i] , arr[j]

这显然是o(n ^ 2)。这可以用更好的方式完成吗?

3 个答案:

答案 0 :(得分:5)

如果数字集受到限制,在某些情况下可以执行一些技巧。从根本上说,你的问题是n ^ 2,但在一般情况下,你没有很多选择。

如果您只需要唯一的对,那么您可以从List中删除重复项(例如将其转储到Set然后再次退出),然后迭代它。

迭代所有唯一对将是:

for (int i=0;i<len;i++) {
    for (j=i+1;j<len;j++) {
    }
}

注意j从i + 1开始循环,所以这比n ^ 2情况好一点,尽管它仍然是非线性增长。

答案 1 :(得分:0)

假设没有重复,将有N选择2 = N(N-1)/ 2个不同的对,这显然是O(N ^ 2)。避免重复可以通过首先删除原始列表中的重复项来完成(这将是额外的O(N log N)操作)。请注意,这会删除任何相等的值对。

答案 2 :(得分:0)

此代码在O(n)中找到重复项。将项目添加到HashSet需要O(1)。我们添加了n项,因此需要O(n)。你走了:

public static void main(String[] args) throws Exception {
    List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6, 2, 4, 6 });
    Set<Integer> set = new HashSet<>();
    for (Integer value : list) {
        if (!set.add(value)) System.out.printf("%d is at least a duplicate\n", value);
    }
}