是否可以在少于O(n)的时间内从排序列表中删除重复项?

时间:2010-11-10 21:50:04

标签: arrays algorithm complexity-theory big-o

我怀疑如果你可以通过更快地找到一系列重复值的另一端而不是通过迭代该子列表来保存,那么

4 个答案:

答案 0 :(得分:12)

一般来说,没有。想象一下N个重复列表。你必须删除N-1,因此O(N)。

如果指定的特定数据结构优于O(1)删除元素,那么对于某些类型的输入可能有更好的方法。

即使您可以有效地删除O(1)中的一系列元素,并且需要O(1)时间来查找重复项 - 想象一下列表中有N / 2对重复项。您仍然需要进行N / 2次搜索并删除N / 2范围,两者都是O(N)。

(由于问题标题是'删除重复项',但也有一点含糊不清,但是主体特定于删除一个范围)

如果排序产生的列表具有以下表示 - 每个节点都有一个值和一个出现次数,那么删除一个值的重复将为该节点简单地设置计数为1。 (A skip list可能具有类似的特征,假设一个体面的垃圾收集环境,其中没有回收内存的成本),因此对于一次复制将是O(1)。如果您需要从列表中删除所有重复项,它仍然是O(N)。

答案 1 :(得分:3)

通常没有,因为你总是可以构造一个你有O(n)的情况(一个没有重复的列表)。如果你开始对数据做出假设(例如,最多只有log n个不同的元素),你可能会得到更好的东西(虽然我不确定这个特殊情况)。

这当然假设您有一些方法可以进行有效的“批量删除”,这意味着您可以删除O(1)中任何相等元素的范围,无论其大小如何。

答案 2 :(得分:1)

不能

比较所有元素与另一个我们需要做的n *(n-1)= n2-n比较...`

答案 3 :(得分:-2)

我会选择“二元搜索”方法来查找范围的结尾:

假设我们有一个n个元素的排序列表。

  1. 比较第1和第n个元素 - 如果相等则整个列表都是重复的。
  2. 选择中间元素(n / 2)
  3. 递归执行两个子列表的搜索。