【问题标题】:ArrayList or Map of Distinct Keys, Faster?ArrayList 或不同键的映射,更快?
【发布时间】:2016-08-19 07:53:42
【问题描述】:

示例:-

列表 A 包含 N 个对象。
列表 B 包含 M 个对象。

列表 A 中的一个对象将仅匹配列表 B 中的一个对象。 匹配条件由我定义,假设它是项目编号、起始日期和区号。如果这些值匹配,那么我会将所有其他值从列表 B 的对象复制到列表 A 的对象。

解决方案:- 有两种解决方案,哪一种更好或更快?

Sol 1:- 只需执行一个 for 循环来匹配列表 A 中的列表 B 的对象。

Sol 2:-
步骤 1:- 从列表 B 创建一个 HashMap 。
步骤 2: - 使用该映射来获取匹配的记录并在列表 A 中设置值。 如果我创建一个地图,那么每个对象的键都是不同的。 假设如果列表 B 有 1000 个对象,那么如果我想创建 HashMap,就会有 1000 个不同的键。

【问题讨论】:

  • 如果我理解正确的话,对于A的每一个元素,都需要在B中找到匹配的元素。如果B是一个列表,那么每次找都是O(N),使得整个过程O( N^2)。如果B是一个HashMap,每次find都是O(1),使得整个过程O(N)。

标签: java arraylist hashmap big-o


【解决方案1】:

您的第二个解决方案更有效。

解决方案 1 需要对 n 对象(列表 A)进行循环,并在 m 对象(列表 B)上进行内部循环。因此这是O(n*m) 或更准确地说是O(n^2)

解决方案 2 需要设置时间(构建 Map),即 O(m),然后扫描列表 A(并且在列表 B 中查找零成本,因为 HashMap 查找是 O(1)。因此,这是O(m)+O(n) 相当于 O(n)。这是一个更好的解决方案。

有一种极端情况,mn很多 - 在这种情况下,设置时间和内存成本可能会很大。

【讨论】:

  • 我们不知道哪个列表更大,所以 O(n*m) 比 O(n^2) 更准确。
  • @Max 不是数学意义上的。
【解决方案2】:

第一个解决方案的复杂度为 O(N*M)。

秒 O(N) + O(M),但消耗更多内存。

第二种算法更快。

【讨论】:

    【解决方案3】:

    让我回顾一下:

    • A(短?)列表 A
    • 一长串 B
    • 列表 A 有一项可能在某些条件下与 B 中的条目匹配
    • 找到 B 条目后,将 B 中的所有其他条目复制到 A。
    • 问题:B 上的 Map(索引的标准键)有帮助吗?

    你可以从 A 中创建一个条件的 HashSet 并遍历 B 直到第一个匹配。

    应该没问题,也快。

    但是是的,绝对应该使用 Map/Set。也许取决于 N

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2014-03-28
      • 2012-11-23
      • 2017-10-27
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多