Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [1, 1, 1, 2, 3]
- => 1
- ['cat', 'dog', 'snake', 'dog']
- => dog
- arr = [1, 1, 1, 2, 3]
- freq = arr.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
- arr.sort_by { |v| freq[v] }.last
- require 'benchmark'
- class Array
- def mode1
- sort_by {|i| grep(i).length }.last
- end
- def mode2
- freq = inject(Hash.new(0)) { |h,v| h[v] += 1; h }
- sort_by { |v| freq[v] }.last
- end
- def mode3
- freq = inject(Hash.new(0)) { |h,v| h[v] += 1; h }
- max = freq.values.max # we're only interested in the key(s) with the highest frequency
- freq.select { |k, f| f == max } # extract the keys that have the max frequency
- end
- end
- arr = Array.new(1_000) { |i| rand(100) } # something to test with
- Benchmark.bm(30) do |r|
- res = {}
- (1..3).each do |i|
- m = "mode#{i}"
- r.report(m) do
- 100.times do
- res[m] = arr.send(m).inspect
- end
- end
- end
- res.each { |k, v| puts "%10s = %s" % [k, v] }
- end
- user system total real
- mode1 34.375000 0.000000 34.375000 ( 34.393000)
- mode2 0.359000 0.000000 0.359000 ( 0.359000)
- mode3 0.219000 0.000000 0.219000 ( 0.219000)
- mode1 = 41
- mode2 = 41
- mode3 = [[41, 17], [80, 17], [72, 17]]
- def mode4
- group_by{|i| i}.max{|x,y| x[1].length <=> y[1].length}[0]
- end
- ========================== IronRuby =====================================
- (iterations bumped to **1000**) user system total real
- mode1 (I didn't bother :-))
- mode2 4.265625 0.046875 4.312500 ( 4.203151)
- mode3 0.828125 0.000000 0.828125 ( 0.781255)
- mode4 1.203125 0.000000 1.203125 ( 1.062507)
- class Array
- def mode4
- group_by{|i| i}.max{|x,y| x[1].length <=> y[1].length}[0]
- end
- end
- user system total real
- mode1 24.340000 0.070000 24.410000 ( 24.526991)
- mode2 0.200000 0.000000 0.200000 ( 0.195348)
- mode3 0.120000 0.000000 0.120000 ( 0.118200)
- mode4 0.050000 0.010000 0.060000 ( 0.056315)
- mode1 = 76
- mode2 = 76
- mode3 = [[76, 18]]
- mode4 = 76
- arr = [1, 1, 1, 2, 3]
- arr.sort_by { |e| arr.grep(e).size }.last # => 1
- class Array
- def mode
- sort_by {|i| grep(i).length }.last
- end
- end
- idx = {}
- [2,2,1,3,1].each { |i| idx.include?(i) ? idx[i] += 1 : idx[i] = 1}
- group_by { |n| n }.values.max_by(&:size).first
- class Array
- def mode1
- group_by { |n| n }.values.max_by(&:size).first
- end
- def mode2
- freq = inject(Hash.new(0)) { |h,v| h[v] += 1; h }
- max = freq.values.max # we're only interested in the key(s) with the highest frequency
- freq.select { |k, f| f == max } # extract the keys that have the max frequency
- end
- end
- arr = Array.new(1_0000) { |i| rand(100000) } # something to test with
- Benchmark.bm(30) do |r|
- (1..2).each do |i| r.report("mode#{i}") { 100.times do arr.send("mode#{i}").inspect; end }; end
- end
- user system total real
- mode1 1.830000 0.010000 1.840000 ( 1.876642)
- mode2 2.280000 0.010000 2.290000 ( 2.382117)
- mode1 = 70099
- mode2 = [[70099, 3], [70102, 3], [51694, 3], [49685, 3], [38410, 3], [90815, 3], [30551, 3], [34720, 3], [58373, 3]]
- def mode
- group_by {|x| x}.group_by {|k,v| v.size}.sort.last.last.map(&:first)
- end
Add Comment
Please, Sign In to add comment