Java 8 : map. 合并时间复杂度

标签 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 中。

最佳答案

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

The default implementation is equivalent to performing the following steps for this map, then returning the current value or null if absent:

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

对于HashMapputremoveget都是O(1) >。您使用的 remappingFunctionInteger::sum ,与 n 无关。所以您解决方案中的 for 循环很简单 O(n)

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

所以你的解决方案很简单O(n)

关于Java 8 : map. 合并时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44490454/

相关文章:

java - 如何从电话管理器中检查电话号码格式是否有效?

java - 在 Clojure 的 Java 中使用锁定宏或监视器进入和监视器退出

c# - .NET C# 逻辑函数,循环函数

PHP 使用默认数组来保持实时数组的正确结构

Hadoop - 在两个客户列表中查找匹配的名称

java - 如何将 gradle 指向可以有不同路径的本地依赖项?

java - 如何获取 TYPE_3BYTE_BGR 中 jpeg 图像的 rgb 值?

algorithm - 3D 最小二乘平面

algorithm - 在 2D 平面中找到边长为 R 的正方形?

git - 删除虚假的提交父指针