【问题标题】:Which style is better for a classic dynamic programming if-not-contains-then-put?哪种风格更适合经典动态编程 if-not-contains-then-put?
【发布时间】:2018-08-06 10:21:10
【问题描述】:

在动态规划问题中,有一个包含以前案例的地图是很正常的,每次你到达一个新的状态时,你必须检查它是否已经在地图中,如果有就使用它,如果没有就添加它.我想知道这两种方式在性能和风格上哪个更好:

Value value;
if(!map.contains(key)){
    value = calculateValue();
    map.put(key, value);
} else {
    value = map.get(key);
}

还有这个:

if(!map.contains(key)){
    map.put(key, calculateValue());
}
Value value = map.get(key);

第二个似乎效率较低,但允许我避免使用未初始化的变量,这可能会在某天导致错误。

【问题讨论】:

  • Map#get 是 O(1) 如果我没记错的话,我不确定一个比另一个性能好得多。我个人会选择最易读的一个,即第二个。不过要注意线程安全。

标签: java performance dynamic-programming


【解决方案1】:

最易读的方式是Map.computeIfAbsent。它在值不存在时添加一个函数调用,这应该可以忽略不计。

代码如下:

final Value value = map.computeIfAbsent(key, k -> calculateValue());

【讨论】:

  • Java-8 地图 api 的变化和语法无疑使代码更加简洁和可读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多