引
-
通过直线l上一点p,做该点的垂线
利用勾股定理,用12等分的线,每个等分点称为一个节点,p点上有一个节点,将p点左侧的第四个节点尽可能的拉直,同理,将p点右侧第3个节点沿直线l方向尽可能拉直,两条垂线就出来了 -
算法
有穷性 finiteness
正确性 correctness
复杂度
- 大o记号(big-o notation)
算法执行时间T(n)
存在正的常数c,对于任何n>>2的都有
则认为n足够大后,f(n)是T(n)的渐进上界,记为
T(n)=O(f(n))
性质
对于任意常数c>0, O(f(n)) = O(cf(n)) ,即忽略正的常系数
对于任意常数 a>b>0 .有 O( ) = O( ) ,忽略多项式中低次幂,只保留高次幂
是最坏情况
- 大
记号
最好情况
g(n) 为渐进下界
运行时间不低于g(n)
- 大
记号
对算法复杂度做出定量的界定
存在正常数 ,和函数h(n) ,对于任何n>>2 都有
则当n足够大时,h(n)给出了T(n)的确界,记为
T(n) = (h(n))
对于规模为n的任意输入,算法的运行时间T(n)都与 (h(n))同阶
- 空间复杂度
空间负责度不算原始输入本身所占的空间
空间复杂度不会对于其执行基本操作的累计次数
每次基本操作所涉及的存储空间,都不超过常数规模,
时间复杂度本事就是空间复杂度的天然上界
- 位运算
j <<=1 j *2
指数级复杂度不能应用于实际中,不是有效算法
递归(recursive)
递归结束条件 = 递归基 (base case of recursion)
- 线性递归(linear recursion)
每个递归实例对自身调用最多一次
a(n)= a(n-1)+2
递归分析
- 递归跟踪(recursion trace)
- 分析递归算法总体运行时间和空间
-
- 算法的每个递归实例都表示为一个框,注明调用的参数
-
- 实例M调用实例NN,则在M与N对于的方框之间添加一条有向联线
例如下[1]:
时间复杂度O(n) ,空间复杂度O(n)
- 实例M调用实例NN,则在M与N对于的方框之间添加一条有向联线
- 递推方程
- 一般表达式 和 递归基条件联立,求解
将递归转化为迭代,利用栈,模拟os,
参考
[1] 邓俊辉,数据结构(C++语言版), 第三版, 清华大学出版社, 2013年9月, ISBN: 7-302-33064-6