减治算法
写在前面的话
本文是本学渣因为考试需要写的一篇总结,只总结了需要考察的考点,所以可能有的内容引申的不多,请见谅。
一、 思想:减少问题规模
与分治法不同,减治法只针对其部分子问题进行求解,同时也是采取划分后选择计算的思想
利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系。一旦建立了这种关系,就可以从顶至下递归的来用该关系,也可以从底至上非递归的来运用该关系:
- 减去一个常量
- 减去一个常量因子
- 减去的规模是可变的
二、 生成组合对象
2.1 Johnson-Trotter算法
Johnson-Trotter算法是一种基于最小变换的全排列生成算法,其生成全排列的具体规则如下:
- 首先,以字典序最小的排列起始,并且为该排列的每个元素赋予一个移动方向,初始所有元素的移动方向都向左。
- 在排列中查找这样的元素,该元素按照其对应的移动方向移动,可以移动到一个合法位置,且移动方向的元素小于该元素,在所有满足条件的元素中,找到其中的最大者。
- 将该元素与其移动方向所对应的元素交换位置。
- 对于排列中,所有元素值大于该元素的元素,反转其移动方向。
伪代码
Algorithm JohnsonTrotter(n)
//实现用来生成排列的Johnson-Trotter算法
//输入:一个正整数n
//输出:{1,...,n}的所有排列的列表
将第一个排列初始化为A={1,2,...n}(方向都为左)
while 存在一个移动元素 do
求最大的移动元素k
把k和它箭头指向的相邻元素互换
调转所有大于k的元素的方向
将新排列添加到列表中
2.2 减治法之减一法
生成n-1个数的排列
将第n个数依次插入n-1个数的每一个排列中
缺点:记录所有中间结果,耗费存储空间
三、减可变规模:插值查找
本节考试主要考察内容为插值查找的动机
与折半查找类似,只是确定mid的方式有所改变:
动机:在预测顺序数组是均匀排布的假设前提下,使用插值查找可以在时间复杂度O(log logn)的情况下比折半查找O(logn)花费更少的查找次数。
最坏情况:数据分布及其不均匀,每次查找只能移动一位,例如在[0,10]之间查找2,但是数据分布却是[0,1,1,1,1,1,1,2,10]这样的。这种情况下时间复杂度会退化到和折半查找最坏情况一样的O(n)