簡體   English   中英

此方法在數組 (python) 中查找反轉次數的時間復雜度是多少?

[英]What's the time complexity of this method to find the number of inversions in an array (python)?

inv=0
for j in range(n):
     inv=inv+ sum((x<arr[j]) for x in arr[j:] )

對於每個元素,我正在檢查數組中小於它出現的元素的數量。( arr[j : ]

它是O(n 2 ) 以下是您可以如何計算:

  • 第一單元,你需要用接下來的n-1個元素進行比較。

  • 對於第二個元素,您需要與接下來的 n-2 個元素進行比較。

    ...

  • 對於第 n元素,您需要與接下來的 0 個元素進行比較。

因此,您總共進行 (n-1) + (n-2) + ... + 1 + 0 = n(n-1) / 2 次比較,這是 n 的二次方。


確實存在更有效的方法。 例如,通過使用基於分而治之的策略,您可以在O(n log(n)) 中計算它們。 看到這個不錯的鏈接

inv=0
for j in range(n):
    inv=inv+ sum((x<arr[j]) for x in arr[j:] )

讓我們把這段代碼分成三部分

1: inv = 0這將需要恆定時間操作 sat T1

2: for j in range(n):這里我們正在為變量n運行一個循環

現在所需的總時間是T1 + N * f(a)這里f(a)是循環體所用的時間。 為簡單起見,我們可以刪除常數因子。 所以復雜度是N * f(a)

現在到了棘手的部分。 什么是 f(a)

3: inv = inv + sum((x<arr[j]) for x in arr[j:] )專注於sum((x < arr[j] for x in arr[j:]) sum 將添加所有低於arr[j]的值

for x in arr[j:]循環for x in arr[j:]

所以你留下 f(a) 作為NN - 1N - 2直到N - N

將所有這些結合在一起,你得到N * (N + N - 1 + N - 2 + ... + N - N)(N * N - 1) / 2O(N^2)

希望你能明白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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