【问题标题】:Find top ten values in a Map在地图中查找前十个值
【发布时间】: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 毫秒。

标签: java algorithm map


【解决方案1】:

对算法的简单修改:

Create a PriorityQueue<Node> with the Comparator sorting the Nodes based
on the Set size

iterate over the map
  for each map node
    if value for node is larger than last entry in priority queue
      create a Node object with the key-value pair
      insert Node into the queue
      trim the queue to ten entries

完成时,优先级队列将仅包含前 10 个条目。

【讨论】:

  • 我没有做额外的测试,因为节点内部已经有一个比较方法,用于在 PriorityQueue 中进行排序。此外,该算法在运行时也不算太糟糕,因为我设法将它弄到了 O(N) 时间,并且总执行时间不到 45 毫秒。
  • 比较测试是将优先级队列中的项目数保持在10或更少,并停止构造不会进入前十的节点对象。但是,在尝试任何优化之前测量性能是正确的 - 否则您将不知道优化的效果。
【解决方案2】:

我不确定您是否想要按键的前 10 个,在这种情况下 Soldier.moth 是正确的,您可以专门获取一个调用 descendingMap 的降序视图,然后迭代前 10 个元素。但是,如果您希望通过其他关系获得前 10 名,只需遍历 elementSet 并将当前前 10 名存储在排序的数据结构中,例如 TreeSet 指定基于大小的比较器 - 不确定您的意思是什么大小,但您可能知道 - - 对于每个元素,如果它小于当前元素,则替换 10 个中最小的一个。您使用 firstKey 获得最小的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多