Пользователь @Mbo поставил хорошую точку в свой ответ :
Пройдите один список в прямом направлении и найдите лучшую пару для item[A]
из второго списка, но начинайтепоиск с обратной стороны второго списка.Для следующего item[A+1]
его элемент пары обязательно должен быть меньше или равен индексу, как предыдущий (K), поэтому вам нужно только один прогон по второму списку.
Вот пример реализациипсевдокод, который он предоставляет ( линейное время сложность, привязанная к длине вашего самого большого списка, который будет списком C из вашего вопроса):
def find(list_c, list_l, threshold):
# all pairs of elements whose product is smaller than 'threshold'
possible_pairs = []
j = len(list_l) - 1
for i in range(len(list_c)):
while list_c[i] * list_l[j] > threshold:
# product is too big, pick a smaller element from 'list_l'
j -= 1
if j < 0:
# exit while loop
break
if j < 0:
# exit for loop
break
# we store some extra info here
possible_pairs.append({
'c_index': i,
'c_elem': list_c[i],
'l_index': j,
'l_elem': list_l[j],
'product': list_c[i] * list_l[j],
})
print(possible_pairs)
# return the pair with the biggest product (closest to threshold)
return max(
possible_pairs,
key=lambda x: x['product'])
Я также проверил это решение:
import random
list_c = list(sorted(random.random()*100 for i in range(100)))
list_l = list(sorted(random.random()*100 for i in range(20)))
print('list_c', list_c)
print('list_l', list_l)
elem = find(list_c, list_l, threshold=50)
print('the best pair is')
print(elem)
В последнем выводе выводится что-то вроде:
{
'c_index': 47,
'c_elem': 46.42324820342966,
'l_index': 0,
'l_elem': 1.0709460533705695,
'product': 49.716794448105375,
}
Как вы можете видеть, подобное решение можно использовать для последовательного вычисления поиска по множеству L
списков, которые вы упомянули.в вашем вопросе.