Создание простого га sh
h = meetings.each_with_object({}) { |g,h| h[g[:id]] = g[:peoples] }
#=> {"1"=>[], "2"=>[], "3"=>[]}
Добавление приглашенных
invited_peoples.each { |g| h[g[:id]] += g[:peoples] }
Сейчас
h #=> {"1"=>["Tom", "Henry", "Georges", "Nicolas"],
# "2"=>["Arthur", "Carl"], "3"=>[]}
Удалить отклонения
absent_peoples.each { |g| h[g[:id]] -= g[:peoples] }
Сейчас
h #=> {"1"=>["Tom", "Nicolas"], "2"=>["Arthur", "Carl"],
# "3"=>[]}
Преобразовать ха sh в массив хешей
h.map { |k,v| { :id=> k, :peoples=> v } }
#=> [{:id=>"1", :peoples=>["Tom", "Nicolas"]},
# {:id=>"2", :peoples=>["Arthur", "Carl"]},
# {:id=>"3", :peoples=>[]}]
Сначала я создал ха sh, и только после обработки приглашенных и отклонившихся я преобразовал его в массив хэшей. Делая это таким образом, вы ускорили :id
поиска для добавления и удаления людей. Как следствие, если n = meetings.size
, эти вычисления имеют вычислительную сложность, близкую к O (n), «близкую к», потому что поиск ключей по ha sh имеет вычислительную сложность, почти равную O (1) (то есть время необходимо найти ключ, и его значение почти постоянно, независимо от размера га sh). Напротив, методы, которые ищут значение :id
в invited_peoples
и absent_peoples
для каждого элемента meetings
, имеют вычислительную сложность O (n 2 ).