Учитывая список L
и int c
, я должен выяснить, есть ли в моем списке два элемента, которые составляют до c
(проблема 2Sum). Я придумал следующий алгоритм:Как это алгоритм 2sum O (nlogn)?
def tsum(L,c):
a=sorted(L)
b=sorted(L,reverse=True)
for kleineZahl in a:
for großeZahl in b:
sum=kleineZahl+großeZahl
if sum>c:
continue
elif sum==c:
return(True)
elif sum<c:
break
return(False)
Теперь я узнал, что это работает в O (N журнал N), так как сортировка занимает O (N журнал N) действия. Предполагается, что «сканирование» принимает O (n) действия. Как идет?
Я понял, что в худшем случае будет L=[1,1,1,1,1,c,c,c,c,c]
. Как время работы не n/2 * n/2, поэтому O (n)?
Так что, если я уже проверил L [8], L [7] и L [6] с L [0], Мне не нужно проверять L [1] с ними, сумма будет больше, чем c anyways, я прав? –
@JustinP: действительно, если вы сохраняете чеки, вам не нужно бежать с крайнего правого на определенное место. Вы можете начать с того, где вы закончили поиск в предыдущее время, сохраняя коэффициент * O (n^2) *. –