Нахождение двух переменных из разных массивов для получения определенной суммы определенной сложности

#python #algorithm #time-complexity

Вопрос:

Я студент-информатик, и это мой первый курс! Итак, я вижу, что это должно быть очень просто, но почему-то я просто не могу уловить это в своей голове.

Так что — упражняйтесь сами:

Def получает два массива с действительными числами (int) и некоторыми S (int). Нужно найти X (некоторый int из массива 1) Y (int из массива 2) = S. НО сложность должна быть O(n m), где n и m-длины массивов.

 def finding_sum(arr1, arr2, s):
  for i in arr1:
    if (s-i in arr2):
      return i, s-i
 

Я думал об этом — но В модуле это все равно, что пройти через весь массив, и это O(n*m).

Ответ №1:

Преобразуйте второй список в набор. Преобразование равно O(m) ,а поиск набора равен O(1).

 def finding_sum(arr1, arr2, s):
    set2 = set(arr2)
    for i in arr1:
        if s-i in set2:
            return i, s-i
 

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

1. Большое вам спасибо!

Ответ №2:

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

 def finding_sum(arr1, arr2, s):
    lookup = {s-n for n in arr1}
    for n in arr2:
        if n in lookup:
            return s-n, n
 

Набор lookup занимает линейное время для создания и обеспечивает O(1) проверку содержимого. Вы можете сократить это, используя next :

 def finding_sum(arr1, arr2, s):
    lookup = {s-n for n in arr1}
    return next((s-n, n) for n in arr2 if n in lookup)
 

Вы можете даже использовать set intersetion, чтобы получить однострочный, но отказаться от любого короткого замыкания:

 def finding_sum(arr1, arr2, s):
    return next((s-n, n) for n in set(arr2).intersection(map(s.__sub__, arr1)))
 

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

1. Спасибо! Ты великолепен =3