按数组中出现的频率排序

时间:2012-05-02 10:15:11

标签: ruby algorithm sorting

有没有一种有效的方法。我有一个数组

a=[1,2,2,3,1,2]

我想以升序输出出现频率。实施例

[[3,1],[1,2],[2,3]]

这是我在ruby中的代码。

b=a.group_by{|x| x}
out={}

b.each do |k,v|
    out[k]=v.size
end

out.sort_by{|k,v| v}

5 个答案:

答案 0 :(得分:15)

a = [1,2,2,3,1,2]
a.each_with_object(Hash.new(0)){ |m,h| h[m] += 1 }.sort_by{ |k,v| v }
#=> [[3, 1], [1, 2], [2, 3]]

答案 1 :(得分:7)

这样的事情:

x = a.inject(Hash.new(0)) { |h, e| h[e] += 1 ; h }.to_a.sort{|a, b| a[1] <=> b[1]}

答案 2 :(得分:5)

您是在尝试制定算法还是仅仅想完成工作?在后一种情况下,不要重新发明轮子:

require 'facets'
[1, 2, 2, 3, 1, 2].frequency.sort_by(&:last)
# => [[3, 1], [1, 2], [2, 3]] 

答案 3 :(得分:2)

使用散列,创建散列,遍历数组,对于数组中的每个数字,更新散列中的计数。它将花费线性时间O(n)并且空间复杂度将等于存储散列O(n)。

答案 4 :(得分:1)

def frequency(a)
  a.group_by do |e|
    e
  end.map do |key, values|
    [key, values.size]
  end
end

a = [1, 2, 2, 3, 1, 2]
p frequency(a).sort_by(&:last)