第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张重叠薄饼,一次插入整体翻面

按大小次序排序

 

posted on 2018-05-27 16:24  秦梦超  阅读(1507)  评论(0编辑  收藏  举报

导航