2015-01-22 2 views
1

У меня есть матрица вроде этого:Поиск через матрицу с Руби

0 1 0 0 1 0 
1 0 1 0 1 0 
0 1 0 1 0 0 
0 0 1 0 1 1 
1 1 0 1 0 0 
0 0 0 1 0 0 

Как я могу определить матрицу в Ruby, а затем искать через него?

Я хотел бы написать программу, которая просматривает все строки и возвращает строки с наибольшей суммой «1».

+5

и что вы пробовали? Вы знаете, как написать этот код на других языках? – Doon

+0

К сожалению нет, рубин - это первый язык, который я начал изучать. – Gregy

+1

http://www.ruby-doc.org/stdlib-2.0/libdoc/matrix/rdoc/Matrix.html –

ответ

3

Быстрый способ определить матрицу в Ruby:

Array.new 6, Array.new(6, 0) 
# => [ 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0] 
    ] 

Приведенный выше код инициализирует массив с 6 и по умолчанию их значения 2-го аргумента, который является другой массив с 6 и значениями 0 по умолчанию.

В других более императивных языках вы должны использовать вложенные циклы:

matrix = [] 
for x in [0,1,2,3,4,5] 
    for y in [0,1,2,3,4,5] 
    matrix[x] ||= [] # create the row as an empty array 
    matrix[x] << y # push the y value to it 
    end 
end 
# matrix is now: 
# => [ 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5] 
    ] 

Для поиска через матрицу и найти строку с наибольшей суммой:

greatest_sum_row_index = 0 
greatest_sum = 0 

matrix.each_with_index do |row, i| 
    # row.inject(:+) is a shortcut to adding each int in the array and returning the sum 
    sum = row.inject(:+) 
    if sum > greatest_sum 
    greatest_sum = sum 
    greatest_sum_row_index = i 
    end 
end 

# highest_row is now the index of the greatest sum row 
matrix[greatest_sum_row_index] # returns the row with the greatest sum 
+0

Спасибо за отличный ответ. Что я могу сделать, если только хочу проверить количество '1' в каждой строке матрицы, а затем вернуть все строки с наибольшей суммой? – Gregy

+0

, если есть только 0s и 1s, тогда сумма всей строки даст вам именно это, количество 1s в нем. Математика – DiegoSalazar

+0

Согласен, в соответствии с моим примером это сработает, но если заданная матрица содержит также другие значения, отличные от 0 и 1, как я могу проверить количество определенного значения? потому что инъекция не будет работать в этом случае. – Gregy

1

Если массив был большим и требование к памяти было беспокойство, вы могли бы сделать что-то вроде этого:

def rows_with_most_ones(arr) 
    arr.each_with_index.with_object([-1, nil]) do |(row,i),best| 
    tot = row.count(1) 
    case tot<=>best.first 
    when 1 then best.replace([tot, [i]]) 
    when 0 then best.last << i 
    end 
    end 
end 

arr = [[0, 1, 0, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 0], 
     [0, 0, 1, 0, 1, 1], 
     [1, 1, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0, 0]] 

rows_with_most_ones(arr) 
    #=> [3, [1, 3, 4]] 
Смежные вопросы