2015-12-22 2 views
2

У меня есть два массива, напримерКак я могу умножить два массива в Ruby?

a = [3, 2, 1] 
b = [1, 2, 3] 

мне нужно умножить их и создать третий массив c, который будет как этот

c = [3 * 1, 2 * 2, 1 * 3] 

Какой метод является лучшим по скорости? Мне нужно сделать это для огромных массивов, и важно время.

+0

@shivam жаль, на самом деле ту же тему, спасибо –

+0

Его хорошо. Рад, что вы нашли то, что искали :) – shivam

+0

Я снова открыл вопрос, потому что OP не ищет сумму. – Stefan

ответ

9
a.zip(b).map{|x, y| x * y} 

............................

+4

Если ваш ответ включал некоторый информативный текст, вам не пришлось бы заполнять его кучей периодов. Ответ с помощью только кода может быть правильным ответом, но он никогда не является отличным ответом. –

1

Вы можете попробовать это:

a.map.with_index{ |x, i| a[i]*b[i]} 
+0

Есть ли способ избежать «х», поскольку он не используется ?. Для дальнейшего использования см. [Как форматировать мои блоки кода] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) –

0

Поскольку вы хотите размножить два массива, мы должны предположить, что они имеют одинаковый размер.

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

a = [3, 2, 1] 
b = [1, 2, 3] 

a.size.times.collect { |i| a[i] * b[i] } 
#=> [3, 4, 3] 

Если время действительно сущности, то, вы можете использовать несколько потоков. Ниже представлена ​​примерная программа, демонстрирующая концепцию. Вы можете использовать его на основе ваших конкретных потребностей.

a = [3, 2, 1] 
b = [1, 2, 3] 

num_cores = 2 # This decides number of threads, ideally equal to number of cores 
ary_size = a.size 

# We need to collect result of each thread as separate sub-array. 
# We will use result array-of-array so that order of result is preserved 
results = Array.new(num_cores, []) 

# Divide the array indexes into equal parts  
index_splits = (0...ary_size).each_slice(num_cores) 

threads = [] 

# Process each sub-array in a thread of its own 
index_splits.each_with_index do |ary, i| 
    threads << Thread.new do 
     results[i] = ary.collect {|j| a[j] * b[j] } 
    end 
end 
threads.each {|t| t.join} 

p results.flatten 
#=> [3,4,3] 
+0

Спасибо всем , я попытаюсь использовать несколько потоков, возможно, это действительно будет работать быстрее. –

+0

Может быть ошибка в моем примере кода в потоках, я над этим работаю. –

+0

Ошибка была устранена сейчас –

2

Попробуйте это:

[[3,2,1],[1,2,3]].transpose.map {|a| a.inject(:*)} 
+0

Добро пожаловать в StackOverflow. Для справок в будущем см. [Как форматировать мои блоки кода] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) –

+0

Спасибо @WandMaker – Akanksha

Смежные вопросы