我有一个列表,其中有500 000个对象,每个对象都有一个坐标。我想在该列表中只留下唯一的对象。为此,我做了以下事情:
for (var i = 0; i < features.length; i++) {
for (var j = 0; j < features.length; j++) {
if (features[i].coord == features[j].coord) {
features.splice(features.indexOf(features[j]), 1);
}
}
}
但它不是有效的解决方案,因为它非常慢,复杂度为O(n ^ 2)。我怎样才能以非常快的方式只留下独特的元素?
答案 0 :(得分:0)
使用hash / map / table /以进行重复数据删除;键(必须是一个字符串)是坐标的表示。
function deduplicate(features) {
function magicalToString(coordinate) {
return 'some string representation of the coordinate';
}
var table = {};
for (var i = 0; i < features.length; i++) {
table[magicalToString(features[i].coord)] = features[i];
}
var uniques = [];
// potential optimization: uniques = new Array(Object.keys(table).length)
// not guaranteed to be net faster; benchmark and measure.
for (var k in table) {
if (table.hasOwnProperty(k)) uniques.push(table[k]);
}
return uniques;
}
O(n)中。