ruby - 在 ruby​​ 算法中使用堆

标签 ruby algorithm heap hashtable nodes

正在研究以下算法:

Given a non-empty array of integers, return the k most frequent elements.

For example, Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note: You may assume k is always valid, 1 ≤ k ≤ number of unique elements. Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

我最初的冲动是使用哈希表,以数字为键,以值作为出现次数。然后,我可以将每个键值对作为一个节点插入到 maxHeap 中,然后简单地删除 max 直到 k == 0。

构建节点并输入 maxHeap 是否是使用该方法解决问题的正确方法? 请注意,我对更优化的解决方案并不好奇——好奇我是否会采用这种方式来实现使用 maxHeap 重复查找具有最大出现次数的数字的想法。 节点部分看起来有点矫枉过正,但我​​不确定还能怎么做。

最佳答案

答案:

代码:

input = [1,1,1,2,2,3]
k = 2

def most_frequent(arr, num = 1)
  arr.group_by(&:itself).sort_by {|_,s| -s.length}.first(num).map(&:first)
end

most_frequent(input, k)

输出:

=> [1, 2]

最大堆答案

require "rubygems"
require "algorithms"

include Containers

input = [1,1,1,2,2,3] 
k = 2

def heap_most_frequent(arr, num = 1)
  max_heap = MaxHeap.new(arr.group_by(&:itself).map{|n,ns| [ns.count,n]})
  (1..num).each_with_object([]) { |i, result| result << max_heap.pop[1]}
end

基准:

            user     system      total        real
orig:   0.050000   0.000000   0.050000   (0.057158)
heap:   0.110000   0.000000   0.110000   (0.112387)

总结

大部分工作都用于生成哈希,在这种情况下,堆在处理键值对时只会使事情复杂化。

关于ruby - 在 ruby​​ 算法中使用堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42460155/

相关文章:

ruby - 如何在 irb 或日志中隐藏 Ruby 对象实例变量?

algorithm - 如何简化/优化 3d 路径?

algorithm - 任何算法难题都可以以纯函数的方式实现吗?

c - 从文件中读取每一行并将该行拆分为字符串和 C 中的数组

ruby - 无法在 OS X 上安装没有 sudo 的 vagrant 插件

ruby - 如何使用 WSDL 并在 Ruby 中实现 SOAP 服务器?

java - 求 N 和 M 之间的每个数字可以表示为一对素数之和的次数

Python heapq heappush 多元素数组真值不明确使用 a.any() 或 a.all()

arrays - 移动窗口的最小值/最大值能否在 O(N) 内实现?

ruby-on-rails - Rails 3. HABTM 表单选择下拉菜单