2012-05-02 3 views

ответ

14
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]] 
+0

почему 'to_a'? – tokland

+0

Вы правы, исправлены – megas

2

использовать хэширование, создать хеш, пересечь массив, для каждого числа в массиве, обновить счет в хэше. это займет линейное время O (n), а пространственная сложность будет равна хранению хэша O (n).

7

Что-то вроде этого:

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

ли быстрый тест, это примерно в два раза быстрее, чем @ Вишал пробираться. –

+1

sort_by (реализованный с помощью преобразования schwartzian) быстрее (и короче для записи), чем сортировка. – tokland

5

Вы пытаетесь разработать алгоритм или вы просто хотите работу? В последнем случае, не изобретайте колесо:

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

Я искал алгоритм. – vishal

+0

ОК, тогда ответ мега-ответа в порядке. – tokland

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) 
Смежные вопросы