簡體   English   中英

計算列表中的對,使其第一個索引小於第二個但第一個元素大於第二個

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM