第六章:变治法
三种类型:
(1)变换为同样问题的一个更简单或者更方便的实例——实例简化
(2)变换为同样实例的不同表现——改变表现
(3)变换为另一个问题的实例,这种问题的算法是已知的——问题简化
6.1预排序:
就是利用合并排序/快速排序,时间复杂度为nlogN的先对要进行计算的数组进行排序
然后将有序数组用来运算
6.2高斯消去法:
初等行变换将原矩阵转变成上三角矩阵然后自底向上进行求解
第一种:从第一行到倒数第二行循环,对其余行进行每个元素循环,减去标杆行修改元素和本行修改元素的比例(效率低)
第二种:从第一个元素到倒数第二个元素,遍历,将对应列的最小的放在最前面,交换行,然后对其余行和该行按修改元素比例进行做差
6.2.1LU分解:
U为上三角矩阵(高斯消去法得出)
L为对角线为1,其余为比例系数的下三角矩阵
Ax=b即为LUx=b
设Ux = b 则为 Ly = b
解y->然后解Ux = y
6.2.2计算矩阵的逆:
退化矩阵:矩阵无法计算逆,逆不存在
非退化矩阵:高斯消去法得到的矩阵对角线上面无0元素即为非退化矩阵
需要计算n2个元素
AB = E
Axj = ej 矩阵A乘以矩阵B的xj列 = 矩阵E的ej列(j∈(1,n))
6.2.3计算矩阵的行列式(计算矩阵的值)
元素下角标之和 奇负偶正
然后乘以代数余子式
6.3平衡查找树:
6.3.1AVL树:
对左右子树求高度差,高度差的绝对值均小于2的二叉查找树(左子树小于根节点,右子树大于根节点)即为AVL树
通过旋转使得新插入节点导致不平衡的AVL树重新变得平衡,通过修改距离插入节点最近的节点来使得AVL树平衡,
时间复杂度logn
6.3.2 2-3树:
2-3树即树可以包含两种类型的节点:两个节点和三个节点
两个节点:一个键,两个子女
三个节点:两个键,三个子女,左小于min,中∈(min,max),右大于max
2-3树总是高度平衡的,树种所有的叶子必须在同一层
2-3树中插入新节点的做法:二节点的找到合适的位置(小于原来的键或者大于原来的键)插入,三节点的插入后分裂,最小的键分到左侧叶子,中间的升入父母节点,最大的放在右侧叶子
6.4堆和堆排序
堆用二叉树表示,且满足两个特性:
1.完全二叉树,只有最后一层的右测可以缺
2.父母优势,父母节点大于所有子女节点
实际用数组表示,第一个空出来
前n/2向下取整是父母节点,后n/2向上取整是子女节点,按照从左到右次序排列
父母节点为i 子女节点为2i 2i+1 子女节点为i 父母节点 i/2向下取整
构造堆两种方法:
1.自底向上构造堆
先按照给的生成完全二叉树,然后作交换保证父母优势,不能则跟子女节点最大的作交换,从最后的父母节点开始,到根,交换后检查交换过来的小节点是否满足父母优势
时间效率O(n)
2.自顶向下构造堆
插入节点方法,然后将新插入的节点和父母节点作比较,直到满足父母优势为止
删除节点的方法:
将要被删除的节点和最后一个节点做交换,规模减一,然后自底向上堆化
6.5霍纳法则和二进制幂
6.5.1霍纳法则
将含x的多次多项式的式子不断提x进行拆解,直到不存在x的多次式
系数从左到右排序
6.5.2二进制幂
1.从左到右的二进制幂
将次方拆成2进制表示 1从左边起每位都平方然后0次方不变1次方+1
2.从右到左的二进制幂
将次方拆成二进制表示 每个二进制位对应a的2的二进制位次方,1则存在,0则不存在
6.6问题简化
6.6.1最小公倍数的问题
1.找出每个的因子相同个数的乘一遍其余不同的各自乘一遍
2.lcm = mxn/gcd(m,n)去除最大公约数
6.6.2计算图中的路径数量
第i个顶点到第j个顶点,长度为k的路径的数量 = pow(A,k)对应(i,j)位置的数目
A为邻接矩阵
6.6.3优化问题的化简
最大化问题和最小化问题的互相转化
max = -min min
6.6.4线性规划问题
背包问题的线性规划解法,给定目标和约束
6.6.5简化为图的问题
同标题