数据结构时间复杂度
复杂度分为时间复杂度和空间复杂度
时间复杂度
概念:
若存在函数f(n)
记作T(n)=O(f(n)) .称O(f(n)) 为时间复杂度。
T(n)为常熟操作执行次数
简单理解,时间复杂度就是把T(n)简化为一个数量级,这个数量级可能为n,n^2``````
1.常数阶
这种与问题规模的大小无关(n的多少),执行时间恒定的算法,O(1)时间复杂度,又叫常数阶。
int sum=0 ,n=100;/*执行1次*/ sum=(1+n)*n/2; /*执行一次*/ printf("%d",sum)/*执行一次*/
2.线性阶
要确定某个算法的阶次,我们需要确定某个特定语句运行的次数。
因此,我们要分析算法的复杂度,关键就是分析循环结构的某个特定语句运行情况。
它的循环的时间复杂度为O(n),因为循环体中的代码需要执行n次
for(int i=0;i<n;i++){ int sum=0;/*时间复杂度为O(1)的程序步骤序列*/ }
3.对数阶
为此count*2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。
由2^x=n 得到x=log2(n),所以这个循环的时间复杂度为O(log2(n)),可以写为O(logN)
int count=1; while(count<n){ count=count*2; /*时间复杂度为O(1)的程序步骤序列*/ }
4.平方阶
这段代码的时间复杂度为O(n^2)
int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ /*时间复杂度为O(1)的程序步骤序列*/ } }
推到时间复杂度的方法:
1.当运行时间只有常数时,则用1来代替。
上面执行了4次但是用O(1)表示。
2.在得到的运行次数函数中,只保留最高阶,且除去最高阶项中相乘的常数。
3.常见的时间复杂度