符号的含义:
https://blog.csdn.net/qq_39745932/article/details/82747191
Θ等于的意思。
Ο表示上界,小于等于的意思。
ο表示上界,小于的意思。
Ω表示下界,大于等于的意思。
ω表示下界,大于的意思。
O(1),O(n),O(logn),O(nlogn)的区别。
O(1):无论数据多大,一次可以找到目标,空间和时间一样;
O(n):需要查找n次,才能确定目标,空间和时间一样;
O(logn):数据增大n倍时,耗时logn次才能确定目标,空间增大,时间相对减少;
O(nlogn):数据增大n倍时,耗时n x logn倍才能确定目标,空间增大,时间也会加长。
logN的底数
1、如果a(a>0,且a≠1)的b次幂等于N,即a^b=N,那么数b叫做以a为底N的对数,记作:logaN=b,其中a叫做对数的底数,N叫做真数。
2、以10为底的对数叫常用对数,记作log10N,简记为lgN;
3、以无理数e(e=2.718 28…)为底的对数叫做自然对数,记作logeN,简记为lnN。
log不写底数的时候,有默认的底数,物理上常用e,编程语言中Math.log常用e。
一般数学计算中常用10,数学学科里面的规矩,通通都是e,特别是在数论里面,基本上不用ln,都用log。
编程比赛OI中一般都是以2为底,计算时间复杂度的时候一般是默认log2。
在计算时间复杂度的时候,你会发现log的底数并不重要,底数的巨大变化并不会带来结果上的数量级变化。
现在来看看为什么底数具体为多少不重要?
假设有底数为2和3的两个对数函数,如上图。当X取N(数据规模)时,求所对应的时间复杂度得比值,即对数函数对应的y值,用来衡量对数底数对时间复杂度的影响。
比值为log2 N / log3 N,运用换底公式后得:(lnN/ln2) / (lnN/ln3) = ln3 / ln2,ln为自然对数,显然这是个常数,与变量N无关。
用文字表述:算法时间复杂度为log(n)时,不同底数对应的时间复杂度的倍数关系为常数,不会随着底数的不同而不同,因此可以将不同底数的对数函数所代表的时间复杂度,当作是同一类复杂度处理,即抽象成一类问题。
当然这里的底数2和3可以用a和b替代,a,b大于等于2,属于整数。a,b取值是如何确定的呢?
有点编程经验的都知道,分而治之的概念。排序算法中有一个叫做“归并排序”或者“合并排序”的算法,它用到的就是分而治之的思想,而它的时间复杂度就是N*logN,此算法采用的是二分法,所以可以认为对应的对数函数底数为2,也有可能是三分法,底数为3,以此类推。
但是不可能是分数或者负数。