ArrayList或不同键的映射,更快?

时间:2016-08-19 07:53:43

标签: java arraylist hashmap big-o

示例: -

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

列表A中的一个对象只匹配列表B中的一个对象。 匹配标准由我定义,假设它是项目号,来自日期和区号。如果这些值匹配,那么我将列表B的对象中的所有其他值复制到列表A的对象。

解决方案: - 有两个解决方案,一个更好还是更快?

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

Sol 2: -
第1步:创建HashMap<字符串,对象>来自清单B.
步骤2: - 使用该地图获取匹配记录并设置列表A中的值。 如果我创建一个地图,那么每个对象的键都是不同的。 假设如果列表B有1000个对象,那么如果我想创建HashMap,则会有1000个不同的密钥。

3 个答案:

答案 0 :(得分:1)

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

解决方案1需要在n个对象(列表A)上循环,并且内部循环超过m个对象(列表B)。因此,O(n*m)或更准确O(n^2)

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

有一个边缘情况,O(n) 大于m - 在这种情况下,设置时间和内存成本可能很高。

答案 1 :(得分:0)

第一种解决方案具有复杂度O(N * M)。

第二个O(N)+ O(M),但消耗更多内存。

第二种算法更快。

答案 2 :(得分:0)

让我回顾一下:

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

你可以从A制作一个标准的HashSet,然后一直走到B,直到第一场比赛。

那也应该没问题,也要快。

但是,肯定应该使用Map / Set。可能取决于N<<微米。