从两个数组中获取非重复的最佳算法

时间:2015-01-26 04:55:20

标签: java arrays algorithm

问题:从两个给定数组(不是排序数组)中查找非重复项。如果数组1是{1,2,3},第二个数组有{2,3,4},那么结果应该是{1,4}。

我做了什么:我是通过使用Set实现的。但似乎是O(n2)。

我需要什么:是否有其他算法可以编写得非常优化?

我的代码:

package src;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TreeSet;

public class GetNonDuplicate {

    public static void main(String[] args) {

        Integer[] arrayOne = {1, 2, 3};
        Integer[] arrayTwo = {2, 3, 4};
        List<Integer> resultList = new ArrayList<Integer>();

        List<Integer> listOfArrayOne =  new ArrayList<Integer>(Arrays.asList(arrayOne));
        TreeSet<Integer> setOne = new TreeSet<Integer>(listOfArrayOne);
        System.out.println("SetOne is : " + setOne);

        for (Integer elem2 : arrayTwo) {

            boolean exists = setOne.add(elem2);
            System.out.println("For elem2 [" + elem2 + "], exists [" + exists + "]." );
            if (exists) {
                resultList.add(elem2);
            }
        }

        System.out.println(resultList);

        List<Integer> listOfArrayTwo =  new ArrayList<Integer>(Arrays.asList(arrayTwo));
        TreeSet<Integer> setTwo = new TreeSet<Integer>(listOfArrayTwo);
        System.out.println("setTwo is : " + setTwo);

        for (Integer elem1 : arrayOne) {

            boolean exists = setTwo.add(elem1);
            System.out.println("For elem2 [" + elem1 + "], exists [" + exists + "]." );
            if (exists) {
                resultList.add(elem1);
            }
        }

        System.out.println(resultList);

    }

}

2 个答案:

答案 0 :(得分:0)

基本上只使用Collections API的解决方案(即没有显式迭代)是

    Integer[] arrayOne = {1, 2, 3};
    Integer[] arrayTwo = {2, 3, 4};
    Set<Integer> set1 = new HashSet<>(Arrays.asList(arrayOne));
    Set<Integer> set2 = new HashSet<>(Arrays.asList(arrayTwo));
    Set<Integer> uniqueTo1 = new HashSet<>(set1);
    uniqueTo1.removeAll(set2);
    Set<Integer> uniqueTo2 = new HashSet<>(set2);
    uniqueTo2.removeAll(set1);
    Set<Integer> result = new HashSet<>(uniqueTo1);
    result.addAll(uniqueTo2);

    System.out.println(result);

这应该在O(n)时间运行,除非我遗漏了一些内容:将数组转换为列表O(n),创建Set s remove } {是HashSet上的常量时间,因此removeAll(...)O(n)

答案 1 :(得分:0)

为数组中的每种类型的项目创建集合。 然后收集那些只有一个项目的数组变量,因此,它们是唯一的项目