在Map中查找最小值的有效方法

时间:2014-10-22 17:43:49

标签: java map min

我正在尝试查找keyMap的最小值 Map<Node, Integer> freeMap = new TreeMap<>(); Node minNode = null; for (Map.Entry<Node, Integer> entry : freeMap.entrySet()) { if (minNode == null) { minNode = entry.getKey(); } else { if (entry.getValue() < freeMap.get(minNode)) { minNode = entry.getKey(); } } }

key

首先,是否有一种直接的方式来查找value foreach,而不是使用Node循环。其次,您能否建议一些备用数据结构方法,可用于存储Integer对象和关联的entry值,因此我可以在常量时间O中以最小值获取{{1}}( 1)。

6 个答案:

答案 0 :(得分:2)

如果您的目标是提高时间的复杂性,那么实际上只有一个可能的变化,从O(n log n)到O(n):

 Map<Node, Integer> freeMap = new TreeMap<>();
 Map.Entry<Node, Integer> minEntry = null;
 for (Map.Entry<Node, Integer> entry : freeMap.entrySet()) {
   if (minEntry == null || entry.getValue() < minEntry.getValue()) {
      minEntry = entry;
   }
 }
 Node minNode = minEntry.getKey();

答案 1 :(得分:0)

O(1)Min的数据结构 对于替代数据结构,如何Priority Queue

您可以使用自定义Comparator,也可以将数据类型设为Comparable

来自javadoc:

  

实施说明:此实现为入队和出队方法提供O(log(n))时间(offer,poll,remove()和add); remove(Object)和contains(Object)方法的线性时间;和检索方法的持续时间(窥视,元素和大小)。

O(1)最小和摊销的数据结构O(1)查找

如果你想要有效的最小和有效的查找并且你控制对数据结构的访问(否则问题的重点是什么?)你可以通过扩展Java的HashMap来跟踪最小元素来推出自己的。

您必须覆盖putputAllremove方法。在每种情况下,您只需调用超类方法(例如super.put(key, value)),然后更新最小元素,该元素将作为新定义的类的实例成员保存。

请注意,此会将删除时间增加到(O(N))(因为您必须更新最小值)。

答案 2 :(得分:0)

我怀疑Integer值在您的系统中不是唯一的。

如果是这种情况,我建议您使用guava库中的TreeMultimap,并使用Integer值作为键。

TreeMultimap<Integer, Node> freeMap = new TreeMultimap<>();
Node minNode =
  freeMap.isEmpty() 
    ? null
    : freeMap.entries().iterator().next().getValue();

答案 3 :(得分:0)

小改进不是一堆:

Map<Node, Integer> freeMap = new TreeMap<Node, Integer>();
Node minNode = freeMap.isEmpty() ? null : (Node) freeMap.entrySet().iterator().next();
for (Map.Entry<Node, Integer> entry : freeMap.entrySet()) {
    if (entry.getValue() < freeMap.get(minNode)) {
        minNode = entry.getKey();
    }
}

得到了退出循环。

答案 4 :(得分:0)

您可以定义自己的Comparator并使用Collections.min。 示例:

sub.cancel();

希望这会有所帮助:)

答案 5 :(得分:0)

这里简洁,高效,优雅的解决方案的关键是Collections#min方法和Map.Entry#comparingByValue方法

第一个方法可以应用于地图的entrySet,第二个方法提供一个Comparator,用于比较地图Entry对象的值。因此,解决方案是单线的,您可以直接获得条目或密钥,如本示例所示:

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

public class KeyWithMinValue
{
    public static void main(String[] args)
    {
        Map<String, Integer> map = new LinkedHashMap<String, Integer>();

        map.put("Zero", 0);
        map.put("One", 1);
        map.put("Two", 2);
        map.put("Three", 3);
        map.put("Four", 4);

        // Obtain the entry with the minimum value:
        Entry<String, Integer> entryWithMinValue = Collections.min(
            map.entrySet(), Entry.comparingByValue());
        System.out.println(entryWithMinValue);

        // Or directly obtain the key, if you only need that:
        String keyWithMinValue = Collections.min(
            map.entrySet(), Entry.comparingByValue()).getKey();
        System.out.println(keyWithMinValue);
    }
}