Javascript 高效的重复搜索算法

Javascript 高效的重复搜索算法,javascript,algorithm,Javascript,Algorithm,我需要一个脚本来高效地搜索一维数组中的所有副本。 我尝试了一种天真的方法: for(var i=0, ii<arr.length-1; i<ii; i++) for(var j=i+1, jj<arr.length; j<jj; j++) if(arr[i] == arr[j]) // remove the duplicate for(var i=0,ii使用LinkedHashSet或OrderedHashSet实现,它

我需要一个脚本来高效地搜索一维数组中的所有副本。 我尝试了一种天真的方法:

for(var i=0, ii<arr.length-1; i<ii; i++)
    for(var j=i+1, jj<arr.length; j<jj; j++)
        if(arr[i] == arr[j])
            // remove the duplicate

for(var i=0,ii使用LinkedHashSet或OrderedHashSet实现,它不允许重复,并在插入、查找和删除时提供预期的O(1)。由于OP表示要删除重复项,因此没有比O(n)更快的方法。在1000000个项目的数组中,最大时间为16ms

  • 创建LinkedHashSet hs
  • arr中的foreach对象对象对象 --hs.add(obj)
一个好的散列函数的复杂度应该是O(n)。

代码可能是最有效的方法。!!这只是set的直接实现

function eliminateDuplicates(arr) {
  var i,
      len=arr.length,
      out=[],
      obj={};

  for (i=0;i<len;i++) {
    obj[arr[i]]=0;
  }
  for (i in obj) {
    out.push(i);
  }
  return out;
}
函数消除重复(arr){
var i,
len=arr.长度,
out=[],
obj={};

对于(i=0;i可能重复,除非您对我将投票给dup的值有一些限制。严格来说,哈希集不能保证
O(n)
的复杂性。我从来没有说过,我说过从数据集中删除重复项是最坏的O(n)。哈希集保证O(1)对于操作,我的意思是使用哈希集不能保证总体的
O(n)
复杂性。不,哈希集不能保证O(1)由于可能的哈希冲突。好的,我尝试了这个解决方案。在向数组中添加值之前进行验证对我来说似乎是一个好的解决方案!我的错误是,LinkedHashSet或OrderHashSet实现避免了冲突。您能解释一下为什么它不能保证O(n)?如果数组中的对象数已知,可以设置容量。