Java 8:map.merge时间复杂度

时间:2017-06-12 02:05:02

标签: java algorithm merge java-8

我试图找到下面代码的复杂性,因为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中。

1 个答案:

答案 0 :(得分:8)

引自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);

put的所有removegetO(1)均为HashMap。您使用的remappingFunctionInteger::sum,与n无关。因此,解决方案中的for循环只是O(n)

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

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