計算數組中的逆序數(inversion)個數

來源:互聯網
上載者:User

標籤:dia   ref   遞迴   部分   快速   get   http   一半   迴圈   

  今天繼續學了演算法,首先是一個計算數組中的逆序數的演算法。

  通常,很容易想到的計算辦法就是運用兩個for迴圈遍曆比較整個數組,當某個數位下標較大,而值卻小於小標比它小的某個位置上的值時,逆序數+1,但是此種演算法複雜度較高,隨著輸入資料規模的增大效率會快速下降(即輸入的數組變大了),具體的複雜度計算方法如下:設數組有n個元素,則需要遍曆n次,而每一次遍曆中要與下標在後面的進行比較,在當次遍曆中,其後具有(n-當次遍曆的元素的下標)個元素,那麼就需要進行n^2/2次操作(後面的元素不需要再與前面的比較),運用notation,最後複雜度應該表示為O(n^2),所依此演算法的效率就隨n的增大而快速降低。所以呢?我們提出一個問題:Can we do better?

  Of course we can, there is always another way.怎麼解決呢?其中一個方法是用merge演算法。(具體是什麼自行研究吧,我也還在學習中,簡單的說就是把數組分成相等的兩部分,如果是奇數就一邊多了一個,另一半少一個,然後就不斷遞迴,分別把兩部分等分成更小的相等部分,最後分到一定小後排好序,分別找出兩部分中分別含有的逆序數(兩個數都在一個部分中),還有就是“構成逆序數”的兩個數字分別在兩部分中),接下來的重點就是找出第二種“逆序數”(我的意思是構成逆序數的第二種方式,就是兩個數在不同的兩個部分),而merge演算法解決這個就很有優勢,理由如下:比如員數組是[ 1, 3, 5, 2, 4, 6],分成兩部分後排好序分別為A[1 , 3, 5], B[ 2, 4, 6],最終的輸出結果為D[1, 2, 3, 4, 5, 6],那麼作如:(相同數字上下連線,連線交點數即為結果)

1  3  5 , 2   4   6

1  2  3     4   5   6

為什麼呢?由A,B產生D的過程就是merge過程,merge通過

i=0, j = 0;

for k=0 to n:

  if A[i] < B[j]:

    D[k] = A[i];

    i++;

  else if A[i] > B[j]:

    D[k] = B[j];

    j++;

這個過程產生最後的D,由此很容易看出,如果在A未被完全轉移到D之前,B中的某個元素先被移到了D中,那麼當B中這個元素移動時,A中還剩餘有多少個元素未移到D的,A中就有多少個元素比這個B中的元素大。綜上,交點數即“那種逆序數”。

計算數組中的逆序數(inversion)個數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.