算法复杂度
O(g(n))表示一个函数集合
定义:O(g(n)) = {f(n):存在c>0,>0,使得对所有n
有0
f(n)
c*g(n)}
例:2=O(
) (即2
O(
) ,
O(
)
2
)
即2是属于O(
) 定义的集合的,假设c=2,
=10,则0
f(n)
c
g(n)即 0
2
2*
即0
,对于所有的n
10,
都大于
,所以2
O(
)
直观上来看,其实O标记定义的就是一个上界,表示算法最糟糕的情况下主要操作的执行次数也不会超过c*(n为规模,如对n个数进行排序),所以如果某算法在最糟糕情况下的主要操作的执行次数为2
,它也依然可以说是时间复杂度为O(
)的算法
(g(n)) = {f(n):存在c>0,
>0,使得对所有n
有0
c*g(n)
f(n)}
(表示的是一个下界)
(g(n)) = {f(n):存在
>0,
>0,
>0,使得对所有n
有0
*g(n)
f(n)
*g(n)}
(表示的是一个渐进紧确界)
o(g(n)) = {f(n):对任意c>0,存在>0,使得对所有n
有0
f(n)<c*g(n)}
(o表示的是一个严格的上界)
(g(n)) = {f(n):对任意c>0,存在
>0,使得对所有n
有0
c*g(n)<f(n)}
(表示的是一个严格的下界)
当n大于某个值到趋于无穷的这个区间中:
f(n)(g(n)): 存在c使得f(n)总小于等于c*g(n)
f(n)(g(n)):存在c使得f(n)总大于等于c*g(n)
f(n)(g(n)):存在
和
使得f(n)总介于
*g(n)和
*g(n)之间
f(n)o(g(n)):不管c多小f(n)都小于c*g(n)
f(n)(g(n)):不管c多大f(n)都大于c*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)是多少项的多项式,只需要看最高次项,增长最快的那项即可
1、log n、n、n*log n、
、
、
、n! 在前面的增长越慢,后面的增长越快