思考:减治提供了一种思考问题的方式
原问题与减一问题的关系
原问题划分成保持语义的子问题,可能规整划分,可能划分不定
我觉得减治与分治的共同点在于: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张重叠薄饼,一次插入整体翻面
按大小次序排序