如何在Ruby中实现优先级队列或堆?

时间:2018-05-22 02:52:56

标签: ruby heap

我有:

words = ["i", "love", "leet", "i", "love", "code"]
k = 3

"i""love"会显示两次,但"leet""code"会显示一次。我想要:

["i", "love", "code"]

而不是"leet"。这段代码:

words.group_by(&:itself).sort_by {|_, s| -s.length}.first(k).map(&:first)

将显示:

["i", "love", "leet"]

解决此问题的好方法是什么?

可以使用堆来解决,但Ruby不支持Heap。有什么建议吗?我想在不使用gem的情况下这样做,以便我可以在在线代码测试网站上进行演示。

=============================================== =========================== k用于频率 所以这个问题是在单词数组中找到k个频率字。 当k为3时,我的计数器选择code而非leet。当有相同的频率字时,我想按字母顺序排序,所以我可以先选择一个。

1 个答案:

答案 0 :(得分:2)

如果您想在频率相同时按字母顺序排序,按字母顺序排序

words.group_by { |w| w }.
      sort_by { |w, a| [-a.size, w] }. # ⇐ HERE
      map(&:first).
      first(3)
#⇒ ["i", "love", "code"]