javascript检查交叉点减少计算复杂性

时间:2013-04-21 16:32:46

标签: javascript for-loop complexity-theory

我有一个列表,其中有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)。我怎样才能以非常快的方式只留下独特的元素?

1 个答案:

答案 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)中。