第4章:减治法——《算法笔记

思考:减治提供了一种思考问题的方式

原问题与减一问题的关系

原问题划分成保持语义的子问题,可能规整划分,可能划分不定

我觉得减治与分治的共同点在于:1.问题的分解 2.子问题语义的保持(可以使用递归)

减治只需求解一个子问题,减法了无需求解的子问题

分治法需要归总子问题,并且归总的过程存在丰富的语义

总而言之,分为两个思路:

1.从减一问题转化为原问题。线性的数学归纳

2.去除不必要的子问题,减小规模

减去一个常量

减去一个常量因子

减去的规模可变

减去一个常量

规模为n的问题  ——>规模为n-1的问题

减去一个常量因子

规模为n的问题  ——>规模为n/2的问题

减去的规模可变

gcd(m,n)=gcd(n,m mod n)

1.插入排序,将未排序元素插入已排序序列。

前方有序,后方无序。

插入动作:二分法搜索位置。

已排序检查算法,大多数已排序序列排序

2.拓扑排序

无环有向图

1.深搜

2.减一治:源删除算法

在剩下的有向图中找源点(没有入边)

3.生成组合对象

n!  (n-1)!

剩余一个插入在n-1排列中

满足最小变化要求

johnson trotter算法

字典序生成排列

生成子集

幂集:所有子集的集合

减一:从空集开始,选择加一个元素与否——>两个新子集

位串表示:每个位表示是否选中单个元素

挤压序:

位串之间最小变化:格雷码

4.减常数因子算法

折半查找

假币问题:折半查找,三折查找

俄式乘法:nxm=(n/2)x2m  (n-1)/2  x2m+m

位表示

5.减可变规模算法

每次迭代减小的规模都不同

第k小元素

第k个顺序统计量

中值

排序,选中值

基于划分的算法:

快速选择算法:遍历一次,选择位置k元素A[k],划分分成大于,小于两部分。解决了更一般的问题:根据k大元素,划分了数组

插值查找:假定数组分布为线性递增,线上照点

二分查找:数字分布不定 

二叉查找树的查找与插入

左<根<右

习题:

渡河问题:船容纳两个小孩或一个大人

交替问题:硬币前正后反——正反交替:相对位置数组:不要求下标从0开始

n元素集合幂集:是否包含最后一个元素

邻接矩阵检测连通性:寻找反例

两两比赛一次,保证每个队伍不输给排名在后面的队伍:插排(冒泡可以么?)

为什么同是基于比较,算法复杂度不一样?

排序算法作用于链表?算法复杂度?

是否要求随机访问

插排

i<j && A[i]>A[j] 一个倒置

倒置数量对排序性能的影响?

平均键值比较次数

希尔排序

dfs拓扑排序效率

如何避免逆序结果

顶点进入dfs栈的顺序取代退出栈的顺序

寻找源或判定环

使用源删除算法

邻接矩阵,邻接表

算法复杂度

强连通分量

dfs,死端编号,颠倒边,

重复

蛛网问题:

不同路径数:排列组合

生成排列算法:heap

最后一个数与heap(n-1)交换一个元素

n奇数:A[1]

偶数:A[i]

基于位串的算法按照挤压序生成子集

生成位串算法

递归/非递归

基于二进制运算/数组

二进制反射格雷码的非递归算法

反转前一位串的最低非0位生成

n元素k分量子集

是否为最小变化算法

格雷码与汉诺塔

一个灯泡,n个开关。

所有开关打开——灯打开

需要尝试的次数

尝试所有排列

不同生成序列的位操作次数(数组操作次数)

链表二分查找

多维数据二分查找

不只是分多维查找?

只能使用两路查找的折半查找

两路查找?

三重查找

比例查找

每步最优,累计最优

连续整数查缺失整数

算法复杂度估计与n nlogn n^2比较

选择预处理

假币二分称重,三分

复杂度

约瑟夫斯问题

发现模式

n二进制位左循环移位得到结果

gcd两次迭代后,规模至少少2(常数因子)

衡量gcd算法规模

用m,n,m-n?

二叉查找树:

删除键

顶点连通度都为偶数,构造欧拉回路

存在性证明?

坏巧克力:1x1

沿直线掰

n张重叠薄饼,一次插入整体翻面

按大小次序排序

原文地址:https://www.cnblogs.com/qmcj/p/9096414.html