算法复习——分而治之篇之逆序对计数问题
以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!
1. 问题背景
逆序对:当 i < j i<j i<j时, A [ i ] > A [ j ] A[i]>A[j] A[i]>A[j]的二元组 ( A [ i ] , A [ j ] ) (A[i], A[j]) (A[i],A[j]),例如下图中的 ( A [ 1 ] , A [ 4 ] ) (A[1], A[4]) (A[1],A[4])、 ( A [ 2 ] , A [ 4 ] ) (A[2], A[4]) (A[2],A[4])等。

那么,问题就变成了如何求解数组中逆序对的个数?
2. 问题定义
逆序对计数问题(Counting Inversions)
输入:
- 长度为 n n n的数组 A [ 1.. n ] A[1..n] A[1..n]
输出:
- 数组 A [ 1.. n ] A[1..n] A[1..n]逆序对的总数,即 ∑ 1 ≤ i < j ≤ n X i , j \sum_{1 \leq i < j \leq n}X_{i, j} ∑1≤i<j≤nXi,j,其中,
X i , j = { 1 , A [ i ] > A [ j ] 0 , A [ i ] ≤ A [ j ] X_{i, j}=\left\{ \begin{array}{rcl} 1, & & {A[i] > A[j]}\\ 0, & & {A[i] \leq A[j]}\\ \end{array} \right. Xi,j={ 1,0,A[i]>A[j]A[i]≤A[j]
3. 分而治之

- 分解原问题:把数组 A A A二分为两个子数组 A [ 1.. n 2 ] A[1..\frac{n}{2}] A[1..2n], A [ n 2 + 1.. n ] A[\frac{n}{2}+1..n] A[2n

最低0.47元/天 解锁文章
1846





