算法的定义
通俗定义:解决问题的方法或过程。
严格定义:
•输入 有0个或多个输入
•输出 有一个或多个输出
•确定性 每条指令清晰、无歧义
•有限性 指令执行次数和时间都有限
性能分析与度量
算法的性能标准
•正确性
•效率与低存储量需求
算法的事前估计
时间复杂度度量:
•运行时间=算法中每条语句执行时间之和。
•每条语句执行时间=该语句的执行次数(频度)* 语句执行一次所需时间。
•语句执行一次所需时间取决于机器的指令性能和速度和编译所产生的代码质量,很难确定。
•设每条语句执行一次所需时间为单位时间,则一个算法的运行时间就是该算法中的所有语句的频度之和。
时间复杂度的表示
•算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间复杂度量度记作:
T(n)=O(f(n))
称作算法的渐进时间复杂度,简称时间复杂度
•常见算法时间复杂度:
O(1): 表示算法的运行时间为常量
O(n): 表示该算法是线性算法
O(logn): 对数时间复杂度,如二分查找算法
O(n2): 数组排序的简单算法,如直接插入排序
O(n3): 做两个n阶矩阵的乘法运算
O(2n): 求具有n个元素集合的所有子集的算法
O(n!): 求具有n个元素的全排列的算法
算法复杂度分析
算法复杂性在渐进意义下的阶:
设f(N)和g(N)是定义在正数集上的正函数。
O的定义:如果存在正的常数C和自然数N0,使得当N>=N0时有:
f(N)<=C*g(N)
则称函数f(N)当N充分大时上有界,且g(N)是它的一个上界,记为:
f(N)=O(g(N))
即f(N)的阶不高于g(N)的阶
根据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(C x f(N))=O(f(N)),其中C是一个正的常数
(6)f=O(f).
Ω的定义:如果存在正的常数C和自然数N0,使得当N>=N0时有f(N)>=Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它的一个下界,记为f(N)=Ω(g(N))。即f(N)的阶不低于g(N)的阶。
θ的定义:定义f(N)=θ(g(N))当且仅当f(N)=O(g(N))且f(N)=Ω(g(N))。此时称f(N)与g(N)同阶。
o的定义:对于任意给定的ε>0,都存在正整数N0,使得当N>=N0时有f(N)/Cg(N)<=ε,则称函数f(N)当N充分大时的阶比g(N)低,记为f(N)=o(g(N)).
例如,4NlogN+7=o(3N2+4NlogN+7)