Для первого сообщения, что данные, отправленные всем получателям, фактически идентичны, таким образом, MPI_Bcast
является правильным подходом. Второе сообщение распределяет разные порции большего массива среди получателей, это делается вместе с MPI_Scatter
. Обратите внимание, что в сообщении разброс включает в себя корневой ранг, поэтому вы можете опустить локальную копию вручную.
Я изменил бы структуру данных на массив хешей:
my_array =
[
{:id => 78, :value=>64, :rating=>-155},
{:id => 84, :value=>90, :rating=>-220},
{:id => 95, :value=>39, :rating=>-92}
]
Можно отсортировать этот вид структуры легко с
my_array.sort_by { |record| record[:rating] }
Для получения подобной хешу функциональности выборки записи идентификатором, можно определить новый метод на my_array:
def my_array.find_by_id(id)
self.find { |hash| hash[:id] == id }
end
так после этого можно сделать
my_array.find_by_id(id)
вместо
my_hash[id]
Хеши в Ruby не могут быть отсортированы (по крайней мере, не прежде 1.9)
Это означает, что цикличное выполнение через Хеш не обязательно приведет к информации в правильном порядке для Вас. Однако это тривиально для цикличного выполнения через Хешированные данные в особом порядке путем преобразования его в Массив сначала, и на самом деле вызов методов сортировки для Хеша преобразует его в Массив для Вас:
>> { :a => 4, :b => 12, :c => 3, :d => 8 }.sort_by { |key, value| value }
=> [[:c, 3], [:a, 4], [:d, 8], [:b, 12]]
Таким образом в Вашем случае:
hsh.sort_by {|key, ratings| ratings[:rating] }
Могла бы быть лучшая структура данных, но (я предполагаю, что это рубиново), возможно сделать в Ruby при помощи встроенного стиля сортировки, чтобы в основном сказать это, как сравнить два. Вот конкретный пример:
my_hash = {
55 => {:value=>61, :rating=>-147},
89 => {:value=>72, :rating=>-175},
78 => {:value=>64, :rating=>-155},
84 => {:value=>90, :rating=>-220},
95 => {:value=>39, :rating=>-92},
46 => {:value=>97, :rating=>-237},
52 => {:value=>73, :rating=>-177},
64 => {:value=>69, :rating=>-167},
86 => {:value=>68, :rating=>-165},
53 => {:value=>20, :rating=>-45}
}
puts "MY HASH"
my_hash.each do |local|
puts local
end
sorted_hash = my_hash.sort { | leftval, rightval | rightval[1][:rating]<=>leftval[1][:rating] }
puts "SORTED HASH"
sorted_hash.each do |local|
puts local
end