将对象数组转换为集合

时间:2014-01-28 16:36:21

标签: arrays algorithm sorting

如果我想将一组对象转换成一组,我怎么能以最有效的方式这样做呢?一个集合不包含重复的值,所以我想我可以使用通用的合并排序算法,它将数组拆分为2个序列,然后从那一点开始使用比较器对数组进行排序,并删除任何重复值从序列A等于序列B.这将给我O(nlogn)。这是正确的方法,还是有更准确/更有效的方法来解决这个问题?

3 个答案:

答案 0 :(得分:1)

你基本上有两个选择。使用基于哈希的解决方案,可以为您提供O(n)平均案例性能 - 以O(n)额外空间为代价,或使用排序解决方案O(nlogn),可以用很少的额外空间来完成。

请注意你不能比它更好,因为这样你可以比建议的方法更好地解决element distinctness problem 1 - 这被认为是不可能的


(1)通过简单地创建集合并检查它的大小是否是数组的大小 - 当且仅当它是,每个元素都是不同的

答案 1 :(得分:0)

您可以使用Map存储已放入Set的元素。这是O(n)算法,但请记住,您将消耗更多内存。这是一个例子:

Set<Integer> s = new HashSet<>();
Map<Integer, Boolean> m = new HashMap<>();

Integer[] array = {1, 1, 1, 2, 3, 6, 1, 2, 5, 7};

for(Integer i: array) {
    if(m.get(i) == null) {
        m.put(i, true);
        s.add(i);
    }
}

将打印

[1, 2, 3, 5, 6, 7]

答案 2 :(得分:0)

当n非平凡时,O(n)肯定比O(n log n)更好?在这种情况下,为什么不迭代列表而不添加重复项,如果你看到一个元素已被添加?