Java 在有序列表中查找元素的最佳算法

Java 在有序列表中查找元素的最佳算法,java,algorithm,iteration,Java,Algorithm,Iteration,有一个列表,其中包含按升序排列的数字 类似地,列表B也包含按升序排列的数字 结果应该是列表C,其中包含A中不在B中的数字 我的解决方案: 我迭代了A,并使用.contains检查了B中的数字,并在C中添加了必需的元素 有人告诉我,使用.contains时的复杂度更高 有谁有更好的解决方案吗?是的,您的方法将使用^2。开始的想法就像将两个排序列表合并为一个。将两个已排序列表合并为一个是一个并集。在两个排序列表中查找公共元素是一个交叉点。您的问题是找到两个排序列表的集合差。在纸上画一个简单的例子,你

有一个列表,其中包含按升序排列的数字

类似地,列表B也包含按升序排列的数字

结果应该是列表C,其中包含A中不在B中的数字

我的解决方案:

我迭代了A,并使用.contains检查了B中的数字,并在C中添加了必需的元素

有人告诉我,使用.contains时的复杂度更高


有谁有更好的解决方案吗?

是的,您的方法将使用^2。开始的想法就像将两个排序列表合并为一个。将两个已排序列表合并为一个是一个并集。在两个排序列表中查找公共元素是一个交叉点。您的问题是找到两个排序列表的集合差。在纸上画一个简单的例子,你会发现你可以使用两个迭代器来按时完成它。

使用类似合并排序的合并例程,使用以下条件将列表中的元素添加到C中:-

如果B->datadata,只需迭代B

ifB->data==A->数据迭代A&B

ifA->datadata将A->data添加到C并迭代A


时间复杂度在

嗯,你知道列表是经过排序的,所以你不必一直在B中搜索,你可以同时在A和B中搜索。你在第一个if中有一个坏条件,它应该是B->datadata。另外,如果允许重复,第二个if不太准确。@pkacprzak告诉thnx在hashset中添加所有元素并使用.contains方法检索它们的想法是错误的。@LGAP否它会找到集合的并集,而不是差异-B@LGAP使用hashset的想法也可以提高时间复杂度并获得hashset差别但是增加了空间开销。一次两个迭代器?我可以知道怎么可能吗?请看@Vikram Bhat的答案。