课时1:程序员
在程序设计方面,什么是比性能更重要的?算法
1 正确性 2 简洁 3 可维护性 4 程序员的时间成本5 健壮性 6 特性(功能)7 模块化 8 安全 9 用户友好安全
为何关注性能?ide
1 性能的好与坏,直接决定着可行仍是不可行模块化
2 算法是一种描述程序行为的语言,普遍应用于计算机科学领域,被全部的实践者所采用的理论语言,一种让程序最为简洁的思考方式。性能是基础函数
insert on sort(插入排序)性能
运行时间的问题:idea
* 输入是否有序设计
* 输入规模:将输入的规模将其参数化,time=f(input size);blog
* 运行时间的上限
最须要关注的一种分析:最坏状况分析
T(n)定义为输入规模为n时的最长运行时间
有时讨论:平均状况
T(n)成了输入规模n之下全部可能输入的指望时间:每种输入的运行时间*那种输入出现的几率
假象,可能永远不会出现,而且有必定的欺骗性:最好状况
算法的大局观(big idea):渐进分析
1 忽略掉那些依赖于机器的常量
2 不是去检查实际的运行时间,而是关注运行时间的增加
渐进符号:Θ(theta)去掉低阶项,忽略前面的常数因子
课时2:
Θ符号:
f(n)=Θ(g(n)),表示存在正常数c一、c2和n0,使对全部的n>=n0,有0<=c1g(n)<=f(n)<=c2g(n);
对任一个函数f(n),若存在正常数c一、c2,使当n充分大时,f(n)能被夹在c1g(n)和c2g(n)中间,则f(n)属于集合Θ(g(n)),
Ο符号:
f(n)=Ο(g(n)),表示存在正常数c和n0,使对全部的n>=n0,有0<=f(n)<=cg(n);
Ο符号在一个常数因子内给出某函数的一个上界
Ω符号:
f(n)=Ω(g(n)),表示存在正常数c和n0,使对全部的n>=n0,有0<=cg(n)<=f(n);
对全部在n0右边的n值,函数f(n)的数值等于或大于cg(n)
定理:对任意两个函数f(n)和g(n),f(n)=Θ(g(n))当且仅当f(n)=Ο(g(n))和f(n)=Ω(g(n));
ο符号:
f(n)=ο(g(n)),对任意正常数c>0,存在常数n0>0,使对全部的n>=n0,有0<=f(n)<=cg(n);
非渐近紧确的上界
ω符号:
f(n)=ω(g(n)),对任意正常数c>0,存在常数n0>0,使对全部的n>=n0,有0<=cg(n)<f(n);
非渐近紧确的下界
当渐进记号只出如今等式(或不等式)的右边,如n=Ο(n*n)时,等号表示集合的成员关系:n∈Ο(n*n);
当渐进符号出如今某个公式中时,咱们将其解释为一个不在意其名称的匿名函数,例如:2n*n+3n+1=2n*n+Θ(n)即表示2n*n+3n+1=2n*n+f(n),其中f(n)是某个属于集合Θ(n)的函数,
经常使用函数:
指数式:对任意实数a>0、m和n,有下列恒等式:
解递归式的三种方法:
(1) 替换法:
第1步 猜答案 第2步 数学概括法 第3步 找出参数,使问题成立
(2) 递归树:
(3 )主方法: