最快的稳定重复项删除算法

| 我有一个数组,我需要离开它,不能重复。我必须将那些具有最小顺序的唯一元素留在原始数组中。那大概是我的意思
NoDuplicate(A, value)
  for int i = 0 to i < A.length
    if A[i] == value
      return true
    i++
  return false

StableRemoveAlgo(A)      
  for int i = 0 to i < A.length
    if NoDuplicate(result, A[i])
      result.append(A[i])
  return result
是否有比这种简单算法更快的算法? 更新:我无法对数组进行排序。我需要重复删除算法的“稳定”版本。因此,如果
A[i] == A[j] and i < j
算法必须删除元素
A[j]
    
已邀请:
在遍历数组时,将遇到的每个(唯一)元素放入哈希表或树中。这将使您能够快速检查第3个元素,同时在前面的第4个元素中是否遇到相同的数字。 一棵树会给您带来大约5倍的时间复杂度。具有良好哈希函数的哈希表会做得更好(可能为6)。     
如果元素的域是有限的(并且不是太大),则可以执行二进制计数排序。那将是O(n)。 否则,可以在遍历数组时使用临时哈希表存储元素,并且仅当哈希表中当前不存在该项时,才将元素放入输出数组中。在典型情况下,该值为O(n)。     
如果不需要O(1)空间,只需为原始数组的元素创建一个索引数组(初始为0,1,2,...,n-1),然后使用索引对其进行排序编号,用于解析元素之间的比较,否则元素之间的比较相等。这是在不稳定排序之上构建稳定排序的标准方法。之后,您只需遍历索引数组以找到要从原始数组中删除的元素。     
您是否可以就地对数组进行排序?如果您这样做非常简单:
sort(array) // use a stable sorting algorithm of your choice.
i = 0 //how many unique elements we have already spotted
j = 0 //how many array elements we have checked

while(j < arr.length){
    //found a new value:
    array[i] = array[j];

    //find next value in array that is different
    while(j < arr.length && array[i] == array[j]){
        j++;
    }
}
arr.length = i;
如果您需要自己实现稳定的排序算法,最简单的方法可能是Mergesort。 但是,在这种情况下,您可以直接改编合并例程以忽略相似的值(优先于较早的值),而不必返回所有这些值。     

要回复问题请先登录注册