【算法复习】减治算法

本文介绍了减治算法的概念,通过Johnson-Trotter算法展示如何生成全排列,同时探讨了减治法在生成组合对象中的应用。此外,文章详细阐述了插值查找的动机,指出在均匀分布假设下,插值查找能提供更快的查找效率。虽然在最坏情况下性能可能退化,但通常能有效减少查找次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

减治算法

写在前面的话

本文是本学渣因为考试需要写的一篇总结,只总结了需要考察的考点,所以可能有的内容引申的不多,请见谅。

一、 思想:减少问题规模

与分治法不同,减治法只针对其部分子问题进行求解,同时也是采取划分后选择计算的思想
利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系。一旦建立了这种关系,就可以从顶至下递归的来用该关系,也可以从底至上非递归的来运用该关系:

  1. 减去一个常量
  2. 减去一个常量因子
  3. 减去的规模是可变的

二、 生成组合对象

2.1 Johnson-Trotter算法

Johnson-Trotter算法是一种基于最小变换的全排列生成算法,其生成全排列的具体规则如下:

  1. 首先,以字典序最小的排列起始,并且为该排列的每个元素赋予一个移动方向,初始所有元素的移动方向都向左。
  2. 在排列中查找这样的元素,该元素按照其对应的移动方向移动,可以移动到一个合法位置,且移动方向的元素小于该元素,在所有满足条件的元素中,找到其中的最大者。
  3. 将该元素与其移动方向所对应的元素交换位置。
  4. 对于排列中,所有元素值大于该元素的元素,反转其移动方向。

image-20210414155329843

伪代码
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的方式有所改变:

img

动机:在预测顺序数组是均匀排布的假设前提下,使用插值查找可以在时间复杂度O(log logn)的情况下比折半查找O(logn)花费更少的查找次数。

最坏情况:数据分布及其不均匀,每次查找只能移动一位,例如在[0,10]之间查找2,但是数据分布却是[0,1,1,1,1,1,1,2,10]这样的。这种情况下时间复杂度会退化到和折半查找最坏情况一样的O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值