痛定思痛,开启算法之路(五)

    没有最优,只有更优;
    算法这个东西,当我们一步步学习、接触的多的时候,会发现永无止境的优化,不得不感叹伟人的智慧光芒、令人回味无穷;
    希望我们自己有一天也可以借助巨人的肩膀贡献自己的力量!

6.5.1霍纳法则(用于求解多项式的一个算法,是一个很好的改变表现技术的例子)
不断将变量x一层层提出,重内部到外在一层层乘出来;

这里写图片描述

借用一个列表来具体表示上述计算过程:第一行提出系数;第二行第一列为第一个系数2,后面为x=3乘以前面的结果并加上本列第一行的数系,具体如下:

这里写图片描述

这里写图片描述

6.5.2 二进制幂(计算a^n)

1)从左向右
利用霍纳法则思想,求解a的n次幂:对于蛮力法很简单就是n个a相乘O(n);将n进行二进制转化,并写成以二进制表示的多项式形式,对于这个转化后的多项式次幂利用霍纳法则,其复杂度为对数级别的,具体实例如下:

这里写图片描述

这里写图片描述

对于其次幂,转化为二进制之后,然后对其二进制系数利用霍纳法则,计算a^n;

2)从右向左
不基于霍纳法则,但同样利用次幂的二进制转化;从右向左累乘,利用a^2^i,对于位为0的不做处理:

这里写图片描述

6.6 问题化简

这里写图片描述

6.6.1求最小公倍数 lcm(m,n):

最小公倍数 lcm(m,n)=公共因子的积*各自独有的因子;回想之前的求最大公约数 gcd(m,n)=公共因子的积(此解法已有高效的欧几里得算法);那么两者之间有什么关系吗,lcm(m,n)=m*n / gcd(m,n); 这就实现了问题及解法的转化;

6.6.2计算图中的路径数量

从图中第i个顶点到第j个顶点之间,长度为k>0的不同路径的数量等于A^k的第(i,j)的元素的值,其中A为该图的邻接矩阵。求路径数量转化为矩阵乘积的值。

6.6.3优化问题的化简

这里写图片描述

根据上图非常明显,最小化与最大化的关系问题,当知道最小化(最大化)的时候,如何利用他们之间的关系去转化从而求出你想要的最大化(最小化);转化的思想!

6.6.4线性规划

线性规划问题是一个多变量线性函数的最优化问题,许多决策最优化的问题都可以化简为线性规划问题的一个实例,这些变量所要满足一些约束是以线性等式或线性不等式的形式出现的。(实际上就是一个具体问题数学化的过程)
例背包问题:

这里写图片描述

6.6.5简化为图问题

把许多问题化简为一种标准的图问题再求解;顶点表示状态,边表示转换;从一个顶点(初始状态)到另一个顶点(目标状态),成为状态空间图。例:

这里写图片描述

这里写图片描述

第七章 时空权衡

1.输入增强:对问题的部分或全部输入做预处理,然后对获得的额外信息进行存储,以加速后面问题的求解;(以空间换取时间)

例:7.1计数法排序

双重循环找到每个元素在其列表的最终位置(即找到比他小的元素的个数,此个数即为其最终位置:从0开始),且需要额外的线性空间用于存储最终元素;其代价相对来说是很高的;

分布计数:对于含有相同元素的待排序序列,找到每个元素出现的频率(个数),及其分布值(表示其最后的坐标值)

这里写图片描述

从最后一个元素往前扫描即12,其最终位置为分布值4-1=3处,然后其分布值4-1=3;在处理下一个元素12(过程同上,位置3-1=2,分布值3-1=2);再下一个元素13,其位置为分布值6-1=5,分布值6-1=5……..

这里写图片描述

假设数组值的范围是固定的,其仅仅对输入数组从头到尾连续处理两遍,显然是一个线性效率的算法。

猜你喜欢

转载自blog.csdn.net/enjoy_endless/article/details/79037321
今日推荐