注:本文原文为英语,由ChatGPT翻译成中文。
计算$\Theta (f(N))$的技巧
示例1:一个For循环
|
|
- 方法1:计算操作次数(精确计数)
“==“操作的总成本/操作次数为: $$ C(N)=1+2+3+\dots+(N-2)+(N-1) = \frac{N(N-1)}{2} $$ 因此,运行时间为$\Theta (N^2)$。
- 方法2:几何可视化
(想象彩色方块-由于是一个三角形区域-运行时间为$\Theta (N^2)$。)
示例2:另一个For循环
|
|
- 方法1:通过可视化找到界限
绘制0.5N(下方虚线)和4N(上方虚线)的轨迹
C(N)将位于这两条线之间
因此,运行时间为$\Theta (N)$。
(个人认为这种方法不如数学方法直观。)
- 方法2:通过数学方法找到界限
想象一下方框:
因此,$C(N)$将为: $$ C(N)=1+2+4+\dots+N= 2N-1 $$ 因此,运行时间为$\Theta (N)$。
示例3:树递归
|
|
- 方法1:直觉
每次将
n
增加1,工作量加倍…这导致运行时间直观上为$2^N$。
- 方法2:代数
$C(N)$的成本为: $$ C(N) = 1+2+4+\dots+2^\left(N-1\right)=2^N-1 $$ 因此,运行时间为$\Theta (2^N)$。
- 方法3:递归关系(超出范围)
从以下开始: $$ C(N)=2C(N-1)+1 $$
示例4:二分查找
- 方法1:直觉
我们从N个选项开始,然后N/2,然后N/4 … 直到只剩下1个。
每次,我们将数组分成两半,因此最后我们必须执行总共$\log_{2}(N)$次操作…
因此,总体运行时间为$\Theta (\log(N))$。
- 方法2:精确计数
因此,$C(N)=\left\lfloor \log_{2}(N) \right\rfloor + 1$(根据观察)。
运行时间为$\Theta(\log(N))$。
示例5:归并排序
- 任意时间单位:相对的时间需求
例如,如果我们运行N=6的选择排序,运行时间的阶数为$N^2$,那么运行时间将为约36个AU。
- 关于归并排序-一个简单的情况(将两个列表合并为一个)
其运行时间为$\Theta (N)$。
- 归并排序-将归并排序应用于排序一个长列表
关键思想是将原始数组分割成最小的片段,并应用归并排序(其运行时间为$\Theta (N)$)。
因此,归并排序的最坏情况运行时间为$\Theta (N \cdot \log(N))$,其中
最上层花费约N个AU。
下一层花费约N/2 + N/2 = N个AU。
再下一层:N/4 + N/4 + N/4 + N/4 = N个AU。
Summary
- There is no magic. Just count.
- 一个比较规范的方法见disc07的
andwelcome()
:- 【1】求Tree Height (number of layers),如二叉树的话就是$logN$
- 【2】求branching factor(分叉系数/ nodes per layer),如二叉树是$2^N$
- 【3】求每个node的operations (work per node),如二叉树是$N/2^i$
- 最后乘起来:$\sum_{i=0}^{logN}\space·\space2^i\space·\space(\frac{N}{2^i}) = n\log{N}$