分治演算法 求逆序對數

2021-10-05 23:02:16 字數 1055 閱讀 3038

在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他對各種不同資訊的興趣,從而實現個性化服務。對於不同的排名結果可以用逆序來評價他們之間的差異。考慮1,2,……,n的排列i1,i2,……in,如果其中存在ij,ik使得jik,那麼就稱ij,ik是這個排列的乙個逆序。乙個排列含有逆序的個數稱為這個排列的逆序數。設計和實現統計逆序的分治演算法,並對演算法進行時間複雜度分析。

尋找陣列中的逆序對數,暴力的做法就是兩層遍歷,比較每兩組數的大小,但暴力做法的時間複雜度達到了o(n^2),這顯然是難以讓人接受的。逆序對的定義是在一對數滿足ij>ik並且ja2[j],那麼a1[i]就能與a2[j]組成逆序對,又因為兩個陣列都是有序的,a1[i]後面的數都大於等於a1[i],所以a1中剩下的數都能與a2[j]組成逆序對,因此逆序數需要加上a1.length-i,並將a2[j]插入到新的有序陣列後,當兩個陣列都掃瞄完時,將得到的新陣列賦給原陣列即可。我們可以用遞迴的方式求出整個陣列的逆序對數。

int merge(int a, int start, int mid, int end)  

else

temp[k++] = a[i++];

} while (i <= mid)temp[k++] = a[i++];//合併剩餘元素

while (j <= end)temp[k++] = a[j++];

for (int i = start,j = 0; i <= end; i++,j++)a[i] = temp[j];//將排序後的陣列賦給原陣列

delete temp;

return count;

}

int inversion_pairs(int a, int start, int end)

資料規模

歸併演算法

暴力演算法

1000

1ms5ms

5000

4ms66ms

10000

8ms263ms

50000

31ms

6495ms

分治法求逆序對數目

設a 1.n 是乙個包含n個不同整數的陣列。如果在ia j 則 i,j 就稱為a中的乙個逆序對 inversion 給出乙個演算法,確定n個元素的任何排列中逆序對的書目。時間複雜度為o nlgn 分治法求解思路 分解 將陣列a 1.n 分為兩個子串行a 1.p 和a p 1,n 二分法將其分解。解決...

分治演算法 expm1 2 求逆序數對數

有乙個數的序列a 1 a 2 a 3 a n 若ia j 則稱a i 與a j 構成了乙個逆序對,設計演算法求數列a中逆序對的個數。方法 歸併排序,只需要加乙個變數存逆序數的對數即可。重點 兩個陣列merge的時候,兩個陣列之間逆序數的對數怎麼求。如果前面陣列中的ai 後面陣列中的aj,那麼逆序數的...

分治演算法 expm1 3 求重要逆序數對數

引入逆序計數問題作為考察兩個序列有多大差別的乙個好的度量指標。但是人們可能感覺這個量度太敏感了。如果i2a j 我們把這對i,j叫做重要的逆序。設計乙個o nlogn 的演算法計數在兩個序列中的重要逆序個數。方法 歸併排序思路,merge我用了兩趟歸併,一趟是專門求重要逆序數的對數,另一趟是將兩個陣...