【问题标题】:Java 8 : map.merge time complexityJava 8:map.merge 时间复杂度
【发布时间】:2017-11-13 09:35:23
【问题描述】:

我试图找出下面代码的复杂性,因为 for 循环它将是 O(n * complexity_of_map.merge)

public int solution(int K, int[] A) {    
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for(int i =0; i < A.length; i++){
        map.merge(K - A[i], 1, Integer::sum);
    }   
    return Arrays.stream(A).map(element -> map.getOrDefault(element,0)).sum();
} 

谁能帮我理解上面代码的时间复杂度和map.merge() 在 Java 8 中。

【问题讨论】:

  • 你想为此写一个minimal reproducible example
  • @pvg 回答这个问题需要哪些额外信息?
  • 只是一些风格说明。从 Java 5 开始,您可以使用 for-each:for(int a: A) map.merge(K - a, 1, Integer::sum);,从 Java 7 开始,您无需在实例化时重复类型参数:Map&lt;Integer, Integer&gt; map = new HashMap&lt;&gt;();

标签: java algorithm merge java-8


【解决方案1】:

引用自 JDK 8 的 Javadoc: https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#merge-K-V-java.util.function.BiFunction-

默认实现等价于执行以下操作 此地图的步骤,然后返回当前值或 null if 缺席:

V oldValue = map.get(key);
V newValue = (oldValue == null) ? value :
          remappingFunction.apply(oldValue, value);
if (newValue == null)
    map.remove(key);
else
    map.put(key, newValue);

所有putremoveget 都是O(1)HashMap。您使用的remappingFunctionInteger::sum,与n 无关。因此,您的解决方案中的 for 循环就是 O(n)

对于流操作,stream + map + sum 应该大致相当于一个简单的for循环,这使得它成为O(n)。您传递给map() 的lambda 调用map.getOrDefault,这也是O(1)HashMap。所以这也是O(n) 的整体。

所以你的解决方案就是O(n)

【讨论】:

  • 我也是这么想的……好回答
  • Map.getOrDefaultO(1)。顺便说一句,如果您专门查看HashMap,则default 实现变得无关紧要,因为HashMap 覆盖了merge 方法。不过当然不会让操作变差,所以还是O(1)
  • 哎呀错字了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2015-05-03
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多