在Java树映射中检索N个最相关的对象
根据this question,我订购了一台Java Map
,如下所示:
ValueComparator bvc = new ValueComparator(originalMap);
Map<String,Integer> sortedMap = new TreeMap<String,Integer>(bvc);
sortedMap.putAll(originalMap);
现在,我想以top-K的方式从地图中提取K
最相关的值。有没有一种高效的方法可以在不遍历地图的情况下实现这一点
另外,一些类似的问题(例如,this)要求解决排名前1的检索问题
# 1 楼答案
不,如果您使用
Map
,则不会。你必须重复一遍你考虑过使用
PriorityQueue
吗?这是Java对堆的实现。它具有插入任意元素和删除“最小值”的高效操作。你可以考虑在这里这样做。你可以把它们放在一个按相关性排序的Map
中,而不是一个PriorityQueue
中,最相关的作为根。然后,要提取最相关的K,只需从PriorityQueue
中弹出K元素如果需要map-like属性(从
String
映射到Integer
),那么可以编写一个类,在内部将所有内容保存在PriorityQueue
和HashMap
中。当你插入时,你同时插入两个;删除最小元素时,从PriorityQueue
弹出,然后告诉您还需要从HashMap
中删除哪个元素。这仍然会为您提供日志时间插入和最小删除