1

数値の配列が与えられた場合、配列内で最も多く繰り返された数値を選択するにはどうすればよいですか?

arr = [4,3, 3, 2, 1, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 1, 3, 4, 0]
4

1 に答える 1

2

ここでは、繰り返されるだけです:

arr = [4,3, 3, 2, 1, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 1, 3, 4, 0]
arr.group_by{|e| e}.max_by{|k,v| v.size}.first
# => 4

また

arr = [4,3, 3, 2, 1, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 1, 3, 4, 0]
arr.uniq.max_by{|e| arr.count(e)}
# => 4

もう1つは連続して繰り返されるためのものです:

arr = [4,3, 3, 2, 1, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 1, 3, 4, 0]
arr.chunk{|e| e}.max_by{|e| e.last.size}.first
# => 4

@Tessiによる Benchmark reportと:

require 'benchmark'
iterations = 10_000
arr = Array.new(1000) {(rand()*100).to_i}

def max_babai1(arr)
  arr.group_by{|e| e}.max_by{|k,v| v.size}.first
end

def max_babai2(arr)
  arr.uniq.max_by{|e| arr.count(e)}
end

Benchmark.bm do |bm|
  bm.report('babai1') do
    iterations.times do
      max_babai1 arr
    end
  end

  bm.report('babai2') do
    iterations.times do
      max_babai2 arr
    end
  end
end

出力

ruby --version
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

ruby bench.rb         
       user     system      total        real
babai1  1.700000   0.000000   1.700000 (  1.707292)
babai2 29.630000   0.010000  29.640000 ( 29.769966)
于 2013-09-09T19:50:41.230 に答える