知识点
2.1 数学基础
法则1:
如果T1(N)=O(f(N))且T2(N)=O(g(N)),那么
(a) T1(N)+ T2(N)= O(f(N)+ g(N))或者T1(N)+ T2(N)= O(max(f(N), g(N)))
(b) T1(N)* T2(N)= O(f(N)* g(N))
法则2:
如果T(N)是一个k次多项式,则T(N)=Θ(N^k)
法则3:
对于任意常数k,(logN)^k=O(N)。它告诉我们对数增长得非常缓慢
2.2 模型
略
2.3 要分析的问题
最大子序列和问题
2.4 运行时间计算
法则1-for循环
一个for循环的运行时间至多是该for循环内部那些语句的运行时间乘以迭代的次数
法则2-嵌套的for循环
从里向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积
法则3-顺序语句
将各个语句的运行时间求和即可,这意味着最大值就是所得的运行时间
法则4-if/else语句
一个if/else语句的运行时间从不超过判断的运行时间再加上s1和s2中运行时间长者的总的运行时间
最大子序列和问题的求解算法一:
三个嵌套for循环,其O(N^3);
算法二:
两个嵌套for循环,其O(N^2),主要是算法一第三个循环计算时加和时重复计算,浪费资源
算法三:
利用分治法,递归计算,其O(NlogN),主要是其将其中一个循环的N变成以一半的进度缩减,不同于逐一缩减
算法四:
属于灵感算法,其主要是依据数学规律及题目条件,其O(N)
运行时间中的对数
如果一个算法用常数时间将问题的大小削减为其一部分,一般为一半,那么该算法就是O(logN)。另一方面,如果使用常数时间只是把问题减少一个常数的数量,如将问题减少1,那么这种算法是O(N)
折半查找
要求序列排序,其只有O(logN)
欧几里得算法
求最大公因数算法,递归出口为除数为0,此时被除数为最大公因数
假设被除数M,除数N。
如果M>N,则MmodN<M/2
幂运算
通过将幂次减半,使其从O(N)变为O(logN)
对知识点的理解
1.f(N)和 g(N)之间的大O关系,可以通过洛必达法则进行处理。
若极限为常数,不为零,则两者增长率相同,若0,则分子小于分母,而且是小o,同理,若无穷,分母小o分子
其实大O关系,就是看增长率,可以将两边不断求导,直至一方为0,观察另一方状态可比较以得两者关系
2.大O关系中一般不把常数因子写进,因为对于大量的次数而言,其所起影响可以忽略不计
3.设计算法要考虑不要浪费计算资源,前面已经算过的应该保存起来,不要重新计算
另外,可以通过数学方法设计数学公式以改进递归方式,优化算法时间
4.要注意算法出口条件和算法过程的设计,以保证算法在周全计算的状态下可被终止
疑惑与难点
1.研究求最小 的正子序列和是否存在O(N)的算法
2.习题第26