Arrays 将对象数组转换为集合

Arrays 将对象数组转换为集合,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,如果我想将一个对象数组转换为一个集合,我将如何以最有效的方式进行转换?一个集合不包含重复的值,所以我想我可以使用一个通用的合并排序算法,该算法将数组拆分为2个序列,然后从这一点开始,使用比较器对数组进行排序,如果序列A中的元素等于序列B,则消除任何重复值。这将给我O(nlogn)。这是正确的方法还是有更准确/更有效的方法来解决此问题?您可以使用映射来存储已放入集中的元素。这是O(n)算法,但请记住,您将消耗更多内存。下面是一个例子: Set s=newhashset(); Map m=新的Has

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

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

Set s=newhashset();
Map m=新的HashMap();
整数[]数组={1,1,1,2,3,6,1,2,5,7};
for(整数i:数组){
如果(m.get(i)=null){
m、 把(我,真的);
s、 加(i);
}
}
威尔印刷品

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

当n是非平凡的时,
O(n)
肯定比
O(n logn)
好吗?在这种情况下,如果您看到已经添加了元素,为什么不在列表上迭代,而不添加重复项呢?

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

请注意,您无法获得比它更好的结果,因为这将使您能够比建议的方法更好地解决1,这被称为不可能



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

是的,基本上就是这样。要么就是创建一个集合,然后插入其中的所有内容。无论是哪种方式,它都是
O(nlogn)
您需要说明您希望设置的界面是什么。此外,接口中每个方法的时间复杂度应该是多少。因为可以使用数组作为集合的实现,插入
O(1)
O(n)
包含检查。如果你戴上比较黑盒的镣铐,这是正确的方法。如果您已经散列或将项目视为位串,则存在替代方案。你能做到吗?你的对象代表什么?@asQuirreL通常你是对的,但在这种情况下,我们希望删除重复的对象。这就是你要找的吗?对于n次插入(在空数组或其他数组中),这需要O(n²)时间。O(n logn)界限也适用于n次插入。给定一个排序数组,可以在O(logn)时间内进行一次插入。然后要注意,这个界限是在一个特定的、限制性的计算模型(代数决策树)中。RAM计算模型更接近真实的机器,可以提供更好的解决方案。