如果我想将一组对象转换成一组,我怎么能以最有效的方式这样做呢?一个集合不包含重复的值,所以我想我可以使用通用的合并排序算法,它将数组拆分为2个序列,然后从那一点开始使用比较器对数组进行排序,并删除任何重复值从序列A等于序列B.这将给我O(nlogn)。这是正确的方法,还是有更准确/更有效的方法来解决这个问题?
答案 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)
更好?在这种情况下,为什么不迭代列表而不添加重复项,如果你看到一个元素已被添加?