給定一個列表L
和一個int c
,我必須找出列表中是否有兩個元素,合計爲c
(2Sum Problem)。我想出了下面的算法:這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 log n)的,因爲排序需要爲O(n log 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大,對不對? –
@JustinP .:事實上,如果您在支票上存款,您不必從最右邊跑到某個特定位置。您可以在上次保存* O(n^2)*因子時結束搜索。 –