逆序对计数算法 -- 分治策略的应用

来源:互联网 发布:火凤凰软件下载 编辑:程序博客网 时间:2024/05/17 00:57

1、逆序对的定义

逆序对即序列中ai与aj,i<j,但是ai>aj,—— 就是序列排列在前面的元素,大于后面的元素。


2、朴素算法


2.1 算法描述

逆序对的朴素算法即暴力法,针对每个元素,遍历该元素后续的所有元素查找计算相当该元素的逆序对,如下图所示:


2.2 算法分析

时间复杂度O(n^2),空间复杂度O(1)


3、归并排序法 -- 分治法


3.1 算法描述

采用归并排序的方法,将原问题划分成两个规模只有一半的子问题,分别求出各自的逆序对个数,最后加上两段之间的逆序对数,即是全部的逆序对数。


归并排序过程会对每个子问题进行排序,之后合并子问题的解。在合并解的过程中,可以计算逆序对,复杂度即O(n)。


具体实现待...


3.2 算法分析

分治法顾名思义,分而治之,将原问题划分成n个规模较小的问题,分别求解,最后通过合并得到的各子问题的解求出原问题的解。可以表示成如下递归式的概念:

根据主定理公式(CLRS 第4章)

在本例中有如下推论:


注意:分治后a和b的取值以及子问题解合并算法的复杂度f(n)之间的关系,如果分治后这3者的关系得到的原问题复杂度并没有减少,此时不宜采用分治法!


这方面的例子参考《算法设计》第5章分治策略5.5节整数乘法的第一种分治法:

        两大整数乘法朴素算法复杂度是n^2,分治后得到4个子问题,每个子问题规模是原问题的1/2,解合并的复杂度是o(n),此时根据主定理得到的分治算法的复杂度同样是O(n^2),相比朴素算法没有任何的减少,徒增了计算的复杂性!

原创粉丝点击