![](/img/trans.png)
[英]How can i check in first List index 1 is greater than second list index 0, and first List index 2 is greater than second list index 1. and so on
[英]Counting the pairs in a list such that their first index is less than the second but the first element is greater than the second
我有清單[5,2,10,9,7]
。
我想計算所有滿足條件的對( i<j and list[i]>list[j] )
例如,索引 5 小於索引 2 但 5 大於 2,因此將計數器增加 1,對於 (10,9) 和 (10,7) 和 (9,7) 相同,因此值計數器將是 4
我已經解決了這個問題,但復雜度為 O(n^2),但我想找到一個時間復雜度最低的解決方案。
這是在 O(n^2) 上運行的代碼
def ques(lista):
b=0
for i in range (len(lista)):
for j in range (1,len(lista)):
if i<j and lista[i]> lista[j] :
b+=1
return b
Mergesort 應該能夠在 O(nlogn) 中做到這一點。 在合並過程中,當我們要合並左右數組時,我們比較arrays的第一個元素,如果右邊數組的第一個元素小於左邊數組的當前第一個數組,彈出它,添加它到一個新的臨時數組。 還將計數器增加左數組的長度(因為左數組中的所有元素都更大但索引更小)。
def mergeSort(a):
if len(a) >= 2:
mid = len(a)//2
left, right = mergeSort(a[:mid]), mergeSort(a[mid:])
temp = []
i, j = 0, 0
for _ in range(len(a)):
if i < len(left) and j < len(right):
if right[j] < left[i]:
temp.append(right[j])
# here we are counting are our pairs
counter[0] += len(left)-i
j += 1
else:
temp.append(left[i])
i += 1
elif i < len(left):
temp.append(left[i])
i += 1
else:
temp.append(right[j])
j += 1
return temp
else:
return a
counter = [0]
arr = [5, 2, 10, 9, 7]
mergeSort(arr)
print(counter[0])
我不認為它可以在少於 O(n^2) 的時間內完成:
事實上,每個元素都應該與它之后的所有元素進行比較,這意味着對於第一個元素,我們需要:n-1 次比較,對於后面的元素,我們需要 n-2 次比較,依此類推。
(n-1) + (n-2) + (n-3) + ... + 2 + 1 => order of n^2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.