1. 分治算法
分治算法的核心就是分而治之,也就是将原问题划分为若干个规模更小但结构与原问题相似的子问题,递归地解决这些子问题然后进行合并,就可以得到原问题的解。比如归并排序就是将原数据划分为左右两个部分,然后分别递归对左右两部分排序,排完序后再合并两个有序区间数据即可得到最终整体有序的数据。
分治算法能解决的问题,一般需要满足以下几个条件:原问题与分解后的子问题求解方法相同
各个子问题可以独立求解,互相之间不依赖
具有分解终止条件,也就是问题足够小时可以直接求解
子问题的合并复杂度不能太高,否则就不能起到减小时间复杂度的作用了
2. 分治算法实战分析
2.1. 逆序数对
数据中逆序元素对的定义为:
。比如 2,4,3,1,5,6 这组数据的逆序元素对就有 (2, 1),(4, 3),(4, 1),(3, 1) 共计 4 个。
怎么统计一组数据中的逆序对数呢?最简单的方法就是针对数组中的每一个元素,查看其后面有多少个大于其的数据。但是,这样操作的时间复杂度是
,有没有更快的方法呢?
借助于分治算法,我们可以将数据划分为左右两部分 L 和 R,分别计算 L 和 R 中的逆序数对,然后再计算 L 和 R 之间的逆序数对,便可以得到整体数据的逆序数对了。这时候,我们可以想到归并排序的合并操作是对左右两个有序数据进行合并&