一 算法运行时间的刻画
对于足够大的输入,精确运行时间中的倍增常量和低阶项被输入的规模本身的影响所支配。当输入规模足够大,使得只有运行时间的增长量级有关时,需要研究渐近效率。渐近地更有效的某个算法对除很小的输入规模外的所有情况将是最好的选择。
二 关于一些数学符号
O:f(n) = O(g(n)) -->存在c>0,n0>0 ; 使得0≤f(n)≤cg(n)当n≥n0时;
集合定义:
O(g(n)) = {f(n);存在c>0,n0>0; 使得0≤f(n)≤cg(n)当n≥n0时}
即:f(n)∈O(g(n))
Ω:f(n) = Ω(g(n)) -->存在c>0,n0>0 ; 使得0≤cg(n)≤f(n)当n≥n0时;
Θ:O∩Ω;可以存在,可以不存在;
o :f(n) = o(g(n)) -->任给c>0,存在n0>0 ; 使得0≤f(n)≤cg(n)当n≥n0时;
ω :f(n) = ω(g(n)) -->任给c>0,存在n0>0 ; 使得0≤cg(n)≤f(n)当n≥n0时
O | 上界 | ≤ |
|
Ω | 下界 | ≥ |
|
Θ | O∩Ω | 类似 = |
|
o | 上界 | < |
|
ω | 下界 | > |
|
三 递归的渐近解
1. 代入法;需要先猜测渐近界的解,然后用归纳法证明此解正确。
2. 递归树法:适用于所有情况,但是此方法不够严谨,一般解出后需要使用代入法验证一下。
3. 主方法:可求解的递归式形式如下:
主定理:
T(n) = aT(n/b)+f(n); 令a≥1和b>1是常数,f(n)是一个函数。
其中将n/b解释为|n/b」或「n/b|。T(n)有如下渐近界。
a:f(n)=O(n^logb(a-ε)) 常数ε>0 --> T(n)=Θ(n^logba);
b:f(n)=Θ((n^logba)) k≥0 --> T(n)=Θ((n^logba)*(log2n));
c:f(n)=Ω(n^logb(a+ε)) ε>0 & af(n/b)≤cf(n) 0<c<1
--> T(n)=Θ(f(n));
视频课上的b情况如下:
b:f(n)=Θ((n^logba)*(log2n)K) k≥0 --> T(n)=Θ((n^logba)*(log2n)K+1);
主定理刻画的分治算法为:生成a个子问题,每个子问题的规模为1/b,分解和合并的步骤共花费时间为f(n);
四 快速排序算法
快速排序随机主元的复杂度期望为nlgn
* 随机选择主元以消除输入顺序对排序复杂度的影响
1 选择主元
2 循环每个元素
3 递归进行
4 优化递归头
* A[]={13 6 9 5 14 8 7 26 3 } * 1 选择主元 13 * 2 循环j比较数组中的元素大小 * {13 6 9 5 14 8 7 26 3 } * i j * {13 6 9 5 14 8 7 26 3 } * i j * {13 6 9 5 14 8 7 26 3 } * i j * {13 6 9 5 8 14 7 26 3 } * i j * {13 6 9 5 8 7 14 26 3 } * i j * {13 6 9 5 8 7 3 26 14 } * i j * 3 调换主元和A[i]的位置,并记住i | p = i for j = 1 -> n-1 if p > A[j] i++ A[j] <--> A[i] j++ A[p] <--> A[i] return i
|