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

How can I implement priority queue or heap in Ruby?

我有:

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"]

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

可以用heap解决,但是Ruby不支持Heap。有什么推荐吗?我想在不使用 gem 的情况下执行此操作,以便我可以在在线代码测试站点上进行演示。

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

如果要在频率相同时按字母顺序排序,按字母顺序排序:

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