我正在尝试查找key
中Map
的最小值 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)。
答案 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来跟踪最小元素来推出自己的。
您必须覆盖put
,putAll
和remove
方法。在每种情况下,您只需调用超类方法(例如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);
}
}