【问题标题】:Is it possible to remove duplicates from a sorted list in less than O(n) time?是否可以在少于 O(n) 的时间内从排序列表中删除重复项?
【发布时间】:2011-05-08 03:49:12
【问题描述】:

我怀疑有一种方法可以通过定位重复值范围的另一端而不是遍历该子列表来更快地保存

【问题讨论】:

  • “列表”是什么意思?在链表中,遍历不可避免地是 O(N)。如果您只是指“一些线性数据结构”,则可以在支持二进制或随机遍历的数据结构(例如树或数组)中使用二进制搜索。
  • 如果排序算法的时间复杂度是O(nlogn),并且可以在O(1)时间内去除重复,那么总体复杂度还是O(nlogn)。
  • 为了澄清我的意思是支持随机访问的线性数据结构,但不支持树。让我们称之为数组。

标签: arrays algorithm complexity-theory big-o


【解决方案1】:

一般来说,不会。想象一个包含 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)。

【讨论】:

  • 想象一个包含 N 个重复项的列表。您必须进行 N-1 次删除,因此 O(N) - 不,如果您知道重复范围的开始和结束,那么您只有一次删除。
  • @Jakub 好吧,其余的可以在 O(1) 中被砍掉。正确释放它会得到 O(n)。
  • @ruslik - 正确定义。恕我直言,对第一个和最后一个元素是否相等的简单检查是正确的。
  • @Jakub 不,我的意思是remove 操作。对于 N 个重复项,如果您不关心释放内存,则可以只删除一次。
  • @Jakub 这就是我正在考虑的特殊情况数据结构,而不是单链表。这不是一个普通的列表,因为要找到块的另一端需要遍历;对于那种情况,也许跳过列表会侥幸逃脱。但它仍然无助于第二种情况。
【解决方案2】:

一般来说没有,因为你总是可以构造一个你有 O(n) 的情况(一个没有重复的列表)。但是,如果您开始对数据进行假设(例如,最多有 log n 个不同的元素),您可能会得到更好的结果(但在这种特殊情况下我不确定)。

这当然假设您有某种方法可以进行有效的“批量删除”,这意味着您可以在 O(1) 中删除任何范围的相等元素,而不管其大小。

【讨论】:

    【解决方案3】:

    不可能

    至于将所有元素与其他元素进行比较,我们需要进行 n*(n-1) = n2-n 比较...`

    【讨论】:

      【解决方案4】:

      我会采用“二进制搜索”方法来查找范围的末端:

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

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

      【讨论】:

      • 你说的是链表还是排序数组?
      • 如果列表有 N/2 个重复项,如何不进行 O(N) 操作?
      • @Blagovest Buyukliev - 这有关系吗?
      • @Pete Kirkham - 我并不是说我的算法总是比 O(n) 更好。对于某些数据集可能会更好
      • 二分查找不能真正在链表上实现,因为你不能随机访问它的元素。你会如何在 O(1) 中“选择一个中间元素”?
      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2023-03-20
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多