逆序對定義:設a[1..n]是乙個包含n個不同數的陣列。如果在ia[j],則(i,j)就稱為a中的乙個逆序對(inversion)。
現給出乙個演算法,其可以用o(n*lgn)的最壞情況執行時間,確定n個元素的任何排列中逆序對的數量。
簡單的演算法實現思想:我們可以單純的通過從前往後的逐一比對來確定逆序對的數量,雖然實現簡單,但這樣一來時間複雜度將會上公升為o(n*n),不符合我們的要求。
改進的演算法實現思想:眾所周知歸併排序的時間複雜度為o(cn*lgn + cn),其中c為常數。因此我們可以通過對歸併排序演算法稍加改進來達到目的。即在每一次歸併兩個子陣列的同時以左邊的子陣列的最大值為基準比對右邊的子陣列中的每個元素,只要左邊子陣列的最大值未複製回上層陣列中,右邊陣列中所有已經複製到上層陣列中的元素均對應乙個逆序對,當左邊子陣列最大值被複製到上層後,如果右邊子陣列未複製完畢,則將右邊最大子陣列中的其餘元素複製到上層對應位置,若右子陣列已經複製完畢則不做任何操作,並終止當前層逆序對計數。例如在歸併排序的某一層中有如下兩個子串行:
左陣列:2 5 9 12
右陣列:3 7 7 19
由於左右陣列都是有序的,那麼當前層所有所有元素被複製回上層後共出現了3個逆序對,分別由右陣列的3、7、7分別產生的,之後將右邊子陣列中的19複製到上層中。最終經層層處理最終可以統計出陣列中逆序對的總數量。
時間複雜讀分析:不難發現,求逆序對的時間和歸併排序大體相當,為o(cn*lgn + cn).若c等於1則簡化為o(n*lgn + n),也即o(n*(lgn + 1))。
演算法導論2 4 O nlgn 時間複雜度求逆序對
給出乙個確定在n個元素的任何排列中逆序對數量的演算法,最壞情況需要o nlgn 時間 include include include int calculate int num,int l,int r return total int main int total calculate num,0,4...
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...