我有两个包含对象的数组,例如:
[{"Start": 1, "End": 2}, {"Start": 4, "End": 9}, {"Start": 12, "End": 16}, ... ]
我想在删除重复项时合并2个数组。目前,我正在做以下事情:
array1.concat(array2);
然后我正在进行嵌套的$.each
循环,但随着我的数组越来越大,这需要O(n^2)
时间来执行,并且不可扩展。
我认为有更快的方法可以做到这一点,但是,我发现的所有示例都使用字符串或整数。
任何推荐的算法或方法可以加快速度吗?
答案 0 :(得分:2)
此答案基于以下假设:订单无关紧要,您可以从对象创建唯一键。
将数组a中的所有n个条目复制到对象c,创建一个唯一键,然后将所有m个条目从数组b复制到该对象(这将自动消除重复项),并且您已完成{{ 1}}:
O(n+m)
此对象中的这种表示法有点多余,但您在合并两个数组时非常快。也许这可以进一步改善。
答案 1 :(得分:1)
先将对象排序,从低到高排序。 O(n log n)
快速排序。
然后你可以制作修剪算法,利用这种排序在O(2n)
的一个循环中遍历两个数组。
合并原始数组和修剪过的数组。
请记住,尽管JavaScript中的对象没有顺序,但您无法对它们进行排序。转换为数组,保留引用并对其进行排序。
答案 2 :(得分:0)
我对javascript并不熟悉,所以不是百分之百确定这是可行的(不确定比较对象的等同性等等),但在java或其他语言中,这样的东西可能会起作用:
在第一次通过之后,你应该有:
{{"Start": 1, "End": 2}:1, {"Start": 4, "End": 9}:1, {"Start": 12, "End": 16}:1, ... }
可能比必须先排序要快一些(如果可以将对象用作键,那么)?