簡體   English   中英

是否可以在少於O(n)的時間內從排序列表中刪除重復項?

[英]Is it possible to remove duplicates from a sorted list in less than O(n) time?

我懷疑有一種方法,如果你可以通過更快地找到一系列重復值的另一端來節省,而不是迭代通過該子列表

一般來說,沒有。 想象一下N個重復列表。 你必須進行N-1次移除,因此O(N)。

如果指定的特定數據結構優於O(1)刪除元素,那么對於某些類型的輸入可能有更好的方法。

即使你可以有效地刪除O(1)中的一系列元素,並且需要O(1)時間來找到重復 - 想象一個列表,其中有N / 2對重復。 您仍然需要進行N / 2次搜索並刪除N / 2范圍,兩者都是O(N)。

(由於問題標題是'刪除重復項',但是還有一點含糊不清,但是主體特定於刪除一個范圍)

如果排序產生的列表具有以下表示 - 每個節點都有一個值和一個出現次數,那么刪除一個值的重復將為該節點簡單地設置計數為1。 跳過列表可能具有類似的特征,假設一個體面的垃圾收集環境,其中沒有回收內存的成本),因此對於一個復制將是O(1)。 如果您需要從列表中刪除所有重復項,它仍然是O(N)。

通常沒有,因為你總是可以構造一個你有O(n)(沒有重復的列表)的情況。 如果你開始對數據做出假設(例如,最多只有log n個不同的元素),你可能會得到更好的東西(雖然我不確定這個特殊情況)。

這當然假設您有一些方法可以進行有效的“批量刪除”,這意味着您可以刪除O(1)中任何范圍的相等元素,無論其大小如何。

不可能

至於比較所有元素與另一個我們需要做n *(n-1)= n2-n比較......

我會選擇“二元搜索”方法來查找范圍的結尾:

假設我們有一個n個元素的排序列表。

  1. 比較第1和第n個元素 - 如果相等則整個列表是重復的。
  2. 選擇一個中間元素(n / 2)
  3. 遞歸執行兩個子列表的搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM