【发布时间】:2014-11-23 16:23:01
【问题描述】:
我已经阅读了很多关于这个主题的内容,并且看到了许多不同的算法。我偶然发现了另一个解决方案,与其他算法相比,我很难理解它的效率,因为它使用一个简单的临时对象来保存数组的现有元素。与使用复杂排序方法和比较的“老派”方法相比,这是一个有效的解决方案吗?
function removeDup(arr){
var element,
existObj= {},
finalArr = [];
for(var i=0;i<arr.length;i++){
element = arr[i];
if(!existObj[element]){
finalArr.push(element);
existObj[element] = true;
}
}
return finalArr;
}
//console.log(removeDup([2,2,2,2,4534,5,7,3]));
console.log(removeDup(["mike","john","alex","mike","john"]));
有朋友告诉我,这里的效率无法明确确定,因为我真的不知道 temp 对象是如何实现的。
【问题讨论】:
-
将
existObj视为哈希映射 - 具有接近O(1)的分配和访问性能。 -
使用 Array.filter 更简单
-
@Bergi :你是对的,因为 O(1)+constant === 0(1),我们没有一个“接近”O(1) 的查找,而是 O (1)。所以这个算法是O(n)。现在,如我的回答所示,通过使用最适合的原生对象,我们可以在这个 O(n) 的“k”上获得 6-10 倍的改进。
-
@GameAlchemist:我不是在谈论常量。分配和访问哈希图中的元素将始终取决于
(k)键的大小(例如属性字符串的长度)、(v)存储值的大小和(n)映射中的项目数 - 只需非常好复杂性。 (免责声明:v对于像这里这样的布尔值或对象指针是常量;k可以通过不访问所有字节的惰性散列函数来减少;如果密钥空间有限,n可能会受到限制) -
@Bergi :我想检查 O(1) 是否足够好,所以我做了一个情节(见我的回答)。实际上 O(1) 是一个很好的近似值,即使价差随着 n 的增加而增加。
标签: javascript algorithm duplicate-removal