【发布时间】:2010-11-10 00:38:53
【问题描述】:
假设我有一个TreeMap<String, Treeset<Song>>,其中对象 Song 具有三个 String 字段和一个内部 CompareTo 方法。地图的键是歌词中的唯一单词,它们不是常见的单词,例如“she”、“the”、“if”或“on”。地图中有多个歌曲副本,因为平均有 60 个单词映射到一首歌曲。
为了获得额外的学分,教授要求我们提出一种算法来查找地图中的前 10 个值。我没有及时解决问题,所以才在这里问。
让我感到困惑的是,与有序数组或列表不同,您不能只按顺序获取最高值。于是,我想到了:
Create a PriorityQueue<Node> with the Comparator sorting the Nodes based
on the Set size
iterate over the map
for each map node
create a Node object with the key-value pair
insert Node into the queue
尽管 PriorityQueue 最终会包含所有键值对,但最大的大小将位于顶部,我只能检索前十个。
这似乎是一种非常迂回的方式,因为这个特定的地图有 31,000 多个节点映射到超过 637,000 个值。有没有更好的办法?
【问题讨论】:
-
事实证明,由于数据集上的顺序循环,该算法在 O(N) 时间内运行良好。此部分的总执行时间为 45 毫秒。