排序和删除列表重复项的最有效算法?

时间:2018-08-31 09:49:14

标签: javascript arrays algorithm sorting

假设我有一个这样的列表:

[ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ]

我想排序并删除重复项以产生:

[ 1, 2, 3, 4, 5, 6, 7 ]

我可以先删除重复的然后进行排序:

const uniqueAndSorted = xs => [ ...new Set(xs) ].sort();

但是,这似乎效率很低,因为我在进行排序时可能会检测到重复项。

从列表中排序和删除重复项的最佳方法是什么?

(首选JavaScript实现;该功能应是非破坏性的)

5 个答案:

答案 0 :(得分:2)

我不确定这是否适用于所有浏览器,但是您可以执行以下操作:

至少在Chrome中有效:

function getSortedSetArray(arr) {
  var map = {};

  arr.forEach(function (elem) {
    map[elem] = true;
  })

  return Object.keys(map);
} 

答案 1 :(得分:1)

您可以通过执行ES6 Set来实现。

例如:

const uniqueAndSorted = xs => Array.from(new Set(xs)).sort();

uniqueAndSorted([ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ])应该返回[1, 2, 3, 4, 5, 6, 7]

答案 2 :(得分:0)

这可行,但是最好对几种方法进行基准测试:

function uniq_sort(a) {
    var seen = {};
    return a.filter(function(item) {
        return seen.hasOwnProperty(item) ? false : (seen[item] = true);
    }).sort();
}

答案 3 :(得分:0)

var myData = [ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ];

myData.reduce((x, y) => x.includes(y) ? x : [...x, y], []).sort() 

答案 4 :(得分:0)

这取决于您拥有的重复项数量。它只有很少的重复项,然后先进行排序,再删除则更快。另一方面,如果您有很多重复项,则首先创建一个哈希集,然后排序是最佳选择。

来源: What's the most efficient way to erase duplicates and sort a vector?

https://www.geeksforgeeks.org/how-to-sort-a-big-array-with-many-repetitions/

另一种选择是使用“脂肪枢轴快速排序”或“三元分解快速排序”,当输入有很多重复项时,该速度比快速排序快:

https://www.toptal.com/developers/sorting-algorithms/quick-sort-3-way