【问题标题】:Best algorithm to find an element in an ordered list [closed]在有序列表中查找元素的最佳算法[关闭]
【发布时间】:2014-01-02 02:35:50
【问题描述】:

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

类似的列表B 也包含升序的数字。

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

我的解决方案:

我遍历A 并使用.contains() 检查B 中的数字,并在C 中添加所需的元素。

有人告诉我使用.contains() 的复杂度为 O(n) 的更高阶。

谁有更好的解决方案?

【问题讨论】:

  • 嗯,你知道列表是排序的,所以你不必一直搜索B,你可以一次搜索A和B。

标签: java algorithm iteration


【解决方案1】:

是的,您的方法将得到 O(n^2)。获得 O(n) 的想法就像将两个排序列表合并为一个。将两个排序列表合并为一个是联合。在两个排序列表中查找公共元素是一个交集。您的问题是找到两个排序列表的集合差异。在纸上画一个简单的例子,你会发现你可以使用两个迭代器在 O(n) 时间内完成。

【讨论】:

  • 一次两个迭代器?我可以知道这是怎么可能的吗?
  • 查看@Vikram Bhat 的回答。
【解决方案2】:

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

if (B->data<A->data) 只需迭代 B

if(B->data==A->data)迭代A&B

if(A->data<B->data)将A->数据添加到C并迭代A

时间复杂度O(N)

【讨论】:

  • 你的第一个if的条件不好,应该是B->data < A->data。此外,如果允许重复,则第二个 if 不是那么准确。
  • @pkacprzak 严重错误 thnx 告诉纠正它
  • 如何将所有元素添加到哈希集中并使用 .contains() 方法检索它们?
  • @LGAP 不,它会找到集合的并集而不是 A-B 的差异
  • @LGAP 使用哈希集的想法也可以用来获得 O(n) 时间复杂度并获得集合差异。但是会增加 O(n) 空间开销。
猜你喜欢
  • 2014-04-19
  • 2015-01-17
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2015-08-08
  • 2016-01-12
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多