2.1计算复杂性
2.2渐进分析
属性:
常见函数阶数由低到高排列:
我的笔记:
他人笔记
1)O(Big-Oh,大O表示法)——表示上限,渐进上界
构造形如
f(n) = c * g(n)
形式的不等式,使得在n ≥ n0的条件下,满足0≤f(n)≤c*g(n)
。(n0是自己取的一个数,要求n0 ≥0)
如图,待分析式f(n)=2n+3
此时,可以构造式子2n+3n,可以保证当n≥1时,f(n)= 2n+3 ≤ 2n+3n = 5n成立
此时,c*g(n)= 5n(c为系数5,g(n)=n)
因为g(n)= n,所以f(n)=O(n)ps:大O表示法可以用比最接近的函数阶数更大的函数来表示。
向上面这种f(n)= 2n+3 ≤ 2n+3n = 5n的情况:用O(n)是最贴切的情况,但是也可以用O(n^2)、O(nlogn)等阶数更高的形式进行表达,只是阶数过大的时候也没什么意义了。
2)Omega(Ω)——表示下限,渐进下界
构造形如
f(n) = c * g(n)
形式的不等式,使得在n ≥ n0的条件下,满足f(n)≥c*g(n)≥0
。(n0是自己取的一个数)
如图,待分析式f(n)=2n+3
此时,可以构造式子1 * logn,可以保证当n≥1时,f(n)= 2n+3 ≥ 1 * logn成立
此时,c*g(n)= 1 * logn(c为系数1,g(n)=logn)
因为g(n)= logn,所以f(n)=O(logn)ps:Omega(Ω)表示法可以用比最接近的函数阶数更大的函数来表示。
同理,向上面这种f(n)= 2n+3 ≥ 1 * logn的情况:用O(logn)是最贴切的情况,但是也可以用O(1)这样阶数更低的形式进行表达,只是阶数过低的时候也没什么意义了。
3)Theta(Θ)——平均界限,渐近紧约束 tight bound
相比大O和Ω,平均界限Θ的选取往往比较严格,只会有一种。
如图,待分析式f(n)=2n+3
此时,可以构造式子c1 * g(n) = 1 * n和式子c2 * g(n) = 5 * n,可以保证当n≥1时,n ≤ f(n)= 2n+3 ≤ 5n成立。此时,不等式两边的g(n)均为n,此时g(n) = n就是平均界限θ。
ps:
平均界限要求不等式两边的g(n)必须相同,如上面的例子,不能左边的g(n)是n,右边的g(n)取n2。ps:
大O(小于等于)并不是只能表示最坏情况,大Ω(大于等于)不是只能表示最好情况,其实用任何符号都可以表示最好情况/最坏情况。
请不要弄混淆。
1、线性时间O(n)
线性时间:运行时间最多是一个常数乘以输入的大小。
●计算n个数a1、a2、…an的最大值
●合并。将两个已排序的列表A = a1,a2,…,an with B = b1,b2,…,bn合并一个有序列表。
合并两个大小为n的列表需要O(n)时间。
Pf.每次比较后,输出列表的长度增加1
2、O(n logn)
O(n logn)时间,出现在分治算法中。也被称为线性时间。
●排序。归并排序和堆排序是执行O(n logn)次比较的排序算法。
●求最大的时间间隔。给定文件副本到达服务器的n个时间戳x1,…,xn,当没有文件副本到达服务器时,最大的时间间隔是多少?
解决方案O(n log n)。对n个时间戳进行排序,按顺序扫描已排序的列表,确定连续时间戳之间的最大间隔。
3、O(
)
二次时间。枚举所有元素对。
●找最近的一对点。给定平面上n个点的列表(x1, y1),…,(xn, yn),找出最接近的一对。
O()解决方案。试一遍所有的点对。
O() seems inevitable, but this is just an illusion. →see chapter 5
4、O(
)
立方。枚举所有元素的三元组。
●设置剥离。给定n个集合S1,。,Sn每一个集合都是1,2,。,n的子集,是否存在不相交的一对集合?
解决方案O()。依次确定每一对集合它们是否不相交。