Javascript-快速删除对象数组中的重复项

Javascript-快速删除对象数组中的重复项,javascript,jquery,algorithm,duplicates,Javascript,Jquery,Algorithm,Duplicates,我有两个数组,其中包含以下对象: [{"Start": 1, "End": 2}, {"Start": 4, "End": 9}, {"Start": 12, "End": 16}, ... ] 我想在删除重复项的同时合并这两个数组。目前,我正在做以下工作: array1.concat(array2); 然后我做了一个嵌套的$。每个循环,但是随着我的数组越来越大,这需要O(n^2)时间来执行,并且不可伸缩 我认为有一种更快的方法可以做到这一点,但是,我发现的所有示例都是使用字符串或整数的 有

我有两个数组,其中包含以下对象:

[{"Start": 1, "End": 2}, {"Start": 4, "End": 9}, {"Start": 12, "End": 16}, ... ]
我想在删除重复项的同时合并这两个数组。目前,我正在做以下工作:

array1.concat(array2);
然后我做了一个嵌套的
$。每个
循环,但是随着我的数组越来越大,这需要
O(n^2)
时间来执行,并且不可伸缩

我认为有一种更快的方法可以做到这一点,但是,我发现的所有示例都是使用字符串或整数的


有什么推荐的算法或方法可以加快这一速度吗?

首先对对象进行排序,从低到高<代码>O(n日志n)
使用快速排序

然后,您可以制作剪枝算法,利用这种排序在
O(2n)
中的一个循环中循环两个数组

合并原始数组和修剪后的数组



请记住,尽管JavaScript中的对象没有顺序,但您不能对它们进行排序。转换为数组,保留引用并对其进行排序。

我对javascript不太熟悉,所以不能100%确定这是可行的(不确定比较对象是否相等的子时间段等),但在java或其他语言中,类似这样的方法可能行得通:

  • 迭代第一个数组
  • 对于每个元素,将其存储到“计数器”哈希映射中,其中key是对象,value是计数
在第一次通过后,您应该有如下内容:

{{"Start": 1, "End": 2}:1, {"Start": 4, "End": 9}:1, {"Start": 12, "End": 16}:1, ... }
  • 然后,迭代第二个数组
  • 对于每个元素,在计数器哈希映射中查找当前元素
  • 如果计数器hashmap包含与当前元素匹配的键,则该键是重复的
  • 否则,追加到第一个数组

可能比必须先排序快一点(如果可以将对象用作键的话)?

这个答案基于这样一个假设,即顺序无关紧要,您可以从对象创建唯一的键

将数组a中的所有n个条目复制到对象c,创建一个唯一键,然后将数组b中的所有m个条目复制到该对象(这将自动消除重复项),并在
O(n+m)
中完成:


这个对象中的这个符号有点多余,但是合并两个数组的速度非常快。也许这可以进一步改进。

它们都是有序数组吗?它们不是有序数组,但如果有办法,我可以通过在每个数组上使用2 for循环和递增索引来加快排序。不使用
$可以获得更好的性能。随着数组变大,每个
。如果顺序不重要,你最好使用objects
{}
然后你可以检查键,这只是o(n)。从来没有听说过二进制排序。。。你是说快速排序吗是的,快速排序,我认为这是大多数JavaScript实现在
数组时使用的方法。使用对象进行排序会更好,因为查找只有o(1),所以可以在o(n)中合并并消除重复项。对象使用HashMap,所以我相信
o(logn)
用于查找。OPs对象没有散列(尽管可以说——查看数据——您可以创建一个散列)。但这并不总是可行的。对象查找基本上是字典查找,使用O(1)。这是非常快的。我尝试了其他列出的算法,这一个执行得最快。
var a = [{"Start": 1, "End": 2}, {"Start": 4, "End": 9}];
var b = [{"Start": 4, "End": 9}, {"Start": 3, "End": 12}];

var c = {};
a.forEach(function(el){c[el.Start+".."+el.End] = el});
b.forEach(function(el){c[el.Start+".."+el.End] = el});

console.log(c);
// yields: {"1..2":{"Start": 1, "End": 2},"4..9":{"Start": 4, "End": 9},"3..12":{"Start": 3, "End": 12}}