【问题标题】:Javascript - Quickly remove duplicates in object arrayJavascript - 快速删除对象数组中的重复项
【发布时间】:2013-01-17 00:30:00
【问题描述】:

我有 2 个数组,其中包含对象,例如:

[{"Start": 1, "End": 2}, {"Start": 4, "End": 9}, {"Start": 12, "End": 16}, ... ]

我想在删除重复项的同时合并 2 个数组。目前,我正在做以下事情:

array1.concat(array2);

然后我正在做一个嵌套的$.each 循环,但是随着我的数组越来越大,这需要O(n^2) 时间来执行并且不可扩展。

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

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

【问题讨论】:

  • 它们都是有序数组吗?
  • 它们不是有序数组,但如果有办法通过使用 2 个 for 循环和每个数组的递增索引来加快速度,我可以对它们进行排序。
  • 随着数组变大,不使用$.each 可以获得更好的性能。
  • 如果顺序无关紧要,你最好使用对象{} 然后你可以检查键,这只是o(n)。

标签: javascript jquery algorithm duplicates


【解决方案1】:

此答案基于以下假设:顺序无关紧要,您可以从对象创建唯一键。

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

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}}

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

【讨论】:

  • 这非常快。我尝试了其他列出的算法,这个算法执行得最快。
【解决方案2】:

首先对对象进行排序,从低到高。 O(n log n) 使用快速排序。

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

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


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

【讨论】:

  • 从来没有听说过二进制排序...你是说快速排序吗? ;) en.wikipedia.org/wiki/Quicksort
  • 是的快速排序,我认为这是大多数 JavaScript 实现在您 Array.sort 时使用的方法
  • 使用对象会更好,您可以合并和消除 o(n) 中的重复项,因为查找只有 o(1)。
  • 对象使用 HashMap,所以我相信 O(log n) 进行查找。 OPs 对象没有散列(尽管可以说 - 查看数据 - 你可以创建一个)。但这并不总是可行的。
  • 对象查找基本上是字典查找,使用 O(1)。
【解决方案3】:

我对 javascript 不太熟悉,所以不能 100% 确定这是可行的(不确定比较对象是否相等等的细微之处),但在 java 或其他语言中,这样的事情可能会起作用:

  • 迭代第一个数组。
  • 将每个元素存储到一个“计数器”哈希图中,其中键是对象,值是计数。

在第一次通过之后,你应该有类似的东西:

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

可能比必须先排序快一点(如果可以使用对象作为键,那就是)?

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2020-07-15
    • 2016-07-02
    • 1970-01-01
    • 2020-10-25
    • 2012-11-24
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多