算法复杂度
算法复杂度分为 时间复杂度 和 算法复杂度 。顾名思义,时间复杂度就是计算一段程序运行时间。而空间复杂度则是计算程序的存储空间。
如今,大多数情况下我们只是去考虑时间复杂度。
时间复杂度分类
1.常数
若对于一个算法,的上界与输入大小无关,则称其具有常数时间,记作时间O(1)。
int a=0;
system.out.println("123213");
上述语句无论执行多少次。它消耗的时间,不随变量增长而增长。哪怕执行几十万行,都可以用**O(1)**来表示它的时间复杂度。
2.对数
若算法的T(n) =O(logn),则称其具有对数时间。由于计算机使用二进制的记数系统,对数常常以2为底(即log2n,有时写作lgn)。然而,由对数的换底公式,logan和logbn只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(logn),而不论对数的底是多少,是对数时间算法的标准记法。
什么是对数?
N = a^x(a 的 x 次方);x=Logan (x以a为底 N的对数)。a成为底数 ,N成为真数
int i=1;
while(i<n){
i=i * 2;
}
上述代码 每次循环相当于不断成以2. 当i大于n时,循环结束。可以转换为 n=2^x; => x = log2n => 舍弃常熟因子。 时间复杂度就是 O(logn)
3.线性
如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。
for(int i=0;i<n;i++){
...............
}
上述代码,随着n的变化运行时间会成一个线性的增长.时间复杂度O(n)
4.线性对数
若一个算法时间复杂度T(n) = O(nlog n),则称这个算法具有线性对数时间。
for(int m=0;m<n;m++){
int i=m;
while(i<n){
i = i * 2;
}
}
上述代码,里层是 O(Logn);外层也要循环n次,这就是 O(n Logn)
。。。待续