поиск пар элементов, удовлетворяющих определенному свойству

#python #list #algorithm

#python #Список #алгоритм

Вопрос:

Если задан ввод [s1, …, sn] и также задано свойство P, программа должна вывести последовательные пары, которые удовлетворяют этому P.

Например, если P означает, что сумма двух элементов в паре должна быть меньше 20, то ввод [1,10,29,17] должен выводить [(1,10)] , поскольку это единственная последовательная пара, которая удовлетворяет этому P.

Для простоты предположим, что проверка свойства P является постоянным временем. Простым решением является цикл по списку, чтобы он был O (n).

Например, в python

 def f(ls, P: callable):
    r = []
    for i in range(len(ls)-1):
        if P(ls[i], ls[i 1]):
            r.append((ls[i], ls[i 1]))
    return r

assert f([1,10,29,17], lambda x, y: x y<=20) == [(1,10)]
assert f([1,10,29,17], lambda x, y: x < y) == [(1,10),(10,29)] # checking if first is smaller than the second 
  

Но мне интересно, есть ли какие-то методы, которые могут ускорить этот процесс. Спасибо!

Ответ №1:

Нет, их нет. Поскольку вы оставили и последовательности, и свойства как абстрактные сущности, мы не можем использовать внутреннюю информацию, чтобы избежать основного требования: мы должны проверять каждый элемент в списке. Это делает O (N) теоретическим минимумом.