首先,有这样5个数字,
1 , 9e6 , 5e3 , 6e4 , 2e2
他们的大小关系应该为
1 5 3 4 2
此时对他们按顺序赋个值,
1 2 3 4 5
接着,我们按从大到小排序
变成
1 2e2 5e3 6e4 9e6
那些赋的值也会跟着排序,变成
1 5 3 4 2
此时,我们就惊奇的发现,与第四行我们所说的大小关系竟然一样。
再看其他例子试试
3e9 2e9 5e9 1e9 4e9
大小关系为
3 2 5 1 4
赋值为
1 2 3 4 5
排序后
1e9 2e9 3e9 4e9 5e9
4 2 1 5 3
发现不一样,说明刚才只是数据特性。
但是我们现在知道了每个数原本应该在的位置,
从后往前看,5e9原本应该在3位置,现在却在最后,而4e9原本应在5位置,现在在4位置。
我们发现,5e9所处的位置,会使其后面遍历到的元素,假设比5e9所处的原位置大,那么会构成逆序对,假设比5e9的位置小,那么不会构成逆序对。当然这只是对5e9来说,如果需要考虑全部的,我们需要的操作是,每次对一个区间加上一个1,说明在该位置之后的位置,都会被构成逆序对。这个区间不难发现是l到最后一个数n。而每次我们也需要查找一个位置(数)。
我们的数组相当于差分数组。
更具象的解释为:我们知道了数字间的相对关系了,从最大的数开始向下遍历,对其原本位置及以后的位置都加上1,表示如果以后有更小的数,其原本位置竟然在大的数原本位置的后面,那么会构成逆序对。而用差分数组,是为快速改变区间和,利用树状数组,是为了快速求前缀和。这里的树状数组就是基于的差分数组构建起来的。
%