Нахождение наибольшей суммы пары значений из 2d-массива в Python

#python #arrays #performance #for-loop #optimization

#python #массивы #Производительность #for-цикл #оптимизация

Вопрос:

У меня есть 2d-массив с целыми положительными числами (не более 10 ^ 6). Массив имеет размер 10 ^ 5×2, например:

 140173 471588 291471 516770 273559 538464 125329 159490 5034   59284  438681 467752 578846 ...
80182  120937 410438 338171 169200 123061 175433 159358 462440 260476 179648 395141 508690 ...
  

Теперь мне нужно найти самую большую пару значений из массива, причем пары формируются с использованием одного значения из верхней строки и одного из нижней строки. У меня есть рабочий пример python, но он действительно медленный (прилагается ниже). Как я могу сделать это быстрее или даже лучше, есть ли лучший способ?

 def solve(n, a, b):

    gD = int(0)

    for i in range(n):
        for j in range(n):
            d = (a[i]   b[j])
            if d > gD: gD = d

    return gD
  

n это длина двух массивов, они имеют одинаковую длину.
Я перебираю все возможные значения, и если оно больше, чем предыдущая самая большая пара, я сохраняю его в gD

Комментарии:

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

2. состоит ли пара из значений в одном столбце? Или это может быть, например, значение столбца 1-й строки 5 и значение столбца 2-й строки 10?

3. @timgeb Я довольно новичок в python и не знал, что это существует, но мне также нужен индекс максимального значения

Ответ №1:

Может быть, просто использовать max?:

 list1 = [44545,8876,4571]
list2 = [46321,8468,77798]

print(max(list1) max(list2))
#122343
  

для возврата первого вхождения (может быть несколько элементов с одинаковым значением) максимального значения:

 id = list1.index(max(list1)) #0
id2 = list2.index(max(list2)) #2
  

Комментарии:

1. Возможно ли с помощью этого получить индекс максимального значения?

2. @jesseb0rn Я отредактировал код, чтобы получить идентификаторы первого или второго списка

3. @Ruli Спасибо за быстрый ответ! Очень помогло!

Ответ №2:

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

 max(i j for i in a for j in b)
  

Ответ №3:

Использование max кажется самым простым решением.

Чтобы имитировать вашу собственную функцию «решить», вы могли бы использовать что-то вроде:

 def solve(n, a, b):
    assert len(a) == n and len(b) == n
    return max(a)   max(b)
  

Но мне интересно, стоит ли передавать n. Если это не является обязательным требованием, вы получите:

 def solve(a, b):
    assert len(a) == len(b)
    return max(a)   max(b)