5

これを行う効率的な方法はありますか。私は配列を持っています

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

出現頻度を昇順に出力したい。例

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

ここにルビーの私のコードがあります。

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

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

out.sort_by{|k,v| v}
4

5 に答える 5

17
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]]
于 2012-05-02T10:29:39.347 に答える
8

このようなもの:

x = a.inject(Hash.new(0)) { |h, e| h[e] += 1 ; h }.to_a.sort{|a, b| a[1] <=> b[1]}
于 2012-05-02T10:20:18.410 に答える
6

アルゴリズムを解決しようとしていますか、それとも単に仕事を終わらせたいだけですか? 後者の場合、車輪を再発明しないでください。

require 'facets'
[1, 2, 2, 3, 1, 2].frequency.sort_by(&:last)
# => [[3, 1], [1, 2], [2, 3]] 
于 2012-05-02T10:35:41.413 に答える
2

ハッシュを使用し、ハッシュを作成し、配列をトラバースし、配列内の各数値について、ハッシュ内のカウントを更新します。線形時間 O(n) がかかり、スペースの複雑さはハッシュ O(n) の格納に等しくなります。

于 2012-05-02T10:18:59.783 に答える
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)
于 2012-05-02T10:43:46.253 に答える