在李开复给大学生的信(2006.4)中,其中一封有写到:算法的力量--->内功;语言的力量--->外功。
算法:解决问题的方法或过程。
算法的性质:
1.输入:有零个或多个外部量作为算法的输入
2.输出:算法产生至少一个量作为输出
3.确定性:组成算法的每一条指令是清晰的、无歧义的
4.有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限
数学方法是证明算法正确性的最好方法,还可以用测试数据。
抽象(ADT 抽象数据类型)+建模
-------------> | 算法 | ------------->
初始状态 终止状态
求解问题的算法:
对于一个明确的数学问题,设计它的算法,总是先选用该问题的一个数据模型。接着弄清楚该问题数据模型在已知条件下的初始状态和要求的结果状态,以及这两个状态之间的隐含关系。然后探索从数据模型的已知初始状态到达要求的结果状态所需的运算步骤。
探索运算步骤时要遵循的原则:
按照自顶向下逐步求精的原则,首先应该考虑算法顶层的运算步骤,然后再考虑底层的运算步骤。
顶层运算步骤:定义在数据模型级上的运算步骤,或称宏观步骤,用自然语言描述。
底层运算步骤:顶层抽象运算的具体实现,或称微观步骤。依赖于数据模型的结构,依赖于数据模型结构的具体表示。
包括两部分:1.数据模型的具体表示 2.定义在该数据模型上的运算的具体实现
企业: 使用类库 ---->调用层 (码农)
——————————————————————
编写类库 ---->实现层 (大牛)
算法复杂性分析:
1.普通算法: 单处理器+随机存取模式RAM
|______ 语句一条条执行,无并发操作。
缺点:计算能力不足
优点:数据加密时,加密易,解密难。(大素数问题)
2.并行算法: eg: Google 并行操作系统
时间复杂度大O与什么有关?
1.输入I 2.规模N 3.算法本身A
大O的运算法则:
1.O(f)+O(g)=O(max(f,g))
2.O(f)+O(g)=O(f+g)
3.O(f)O(g)=O(fg)
4.如果g(N)=O(f(N)),则O(f)+O(g)=O(f)
5.O(Cf(N))=O(f(N)),其中C是一个正的常数
6.f=O(f)
证明:O(f)+O(g)=O(f+g)
使用定义法证明如下:
假设O(f)=F(n),存在C1和N1,使得N>=N1时,F(n)<=C1f(n);
假设O(n)=G(n),存在C2和N2,使得N>=N2时,G(n)<=C2g(n);
假设C3=max{C1,C2},N3=max{N1,N2}
当N>>N3时,O(f)+O(g)=F(n)+G(n)<=C1f(n)+C2g(n)<=C3f(n)+C3g(n)=C3T(f+g)=O(f+g)
得证。