赞
踩
前一段时间以为自己Java学的不错就出去面试了,打算找一个暑期实习锻炼一下自己,本来以为开发做后端Java程序员可以跳过算法这些东西,结果面试官上来就问了时间复杂度的概念,因为本科学的不是计算机专业所以直接蒙圈,也给面试官留下了很不好的印象,后面问到java集合,redis等存取元素的时候,又问到了时间复杂度等概念,真是一步走不好,步步走不好,2021年暑假到了,从今天开始学习数据结构与算法,从哪跌倒就从哪爬起来,开始恶补算法和数据结构知识啦!下面步入正题:
想要了解时间复杂度,必须要了解时间频度的概念
时间频度:一个算法中的语句执行的次数,称为语句频度或时间频度,记为T(n)。
例如:T(n)=3n 2+2n+4
特点:
因为当n最够大的时候,其主要作用的就是只有最高阶次。
时间复杂度:一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记为T(n)=O(f(n))称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
平均时间复杂度:所有可能的输入实例均已等概的情况下该算法的运行时间。
一般情况下,所讨论的时间复杂度都是最坏情况下的时间复杂度。
例如:
T(n)=3n 2+2n+4
取辅助函数f(n)=n 2
即当n趋于无穷时T(n)/f(n)=3
故时间复杂度为:
T(n)=O(n2)
1.常数阶O(1)
复杂度不随n的变化而变化的普通简单代码语句
int i=1;
int j=2;
i=i++;
j=j++;
2.对数阶O(log2n)
底数也可以是3,4,5,10等常数,主要看具体的算法
int i=1;
int n=10000;
while(i<n){
i=i*2;
}
3.线性阶O(n)
一般是指一层for循环
for(int i=0;i<=n;i++){
}
4.线性对数阶O(nlog2n)
对数阶和线性阶的组合,即for循环里面嵌套一个while()
for(int i=0;i<=n;i++){
while(i<n){
i=i*2;
}
}
5.平方阶O(n2)
两层for循环嵌套使用的时间复杂度,许多排序算法的时间复杂度都是平方阶。
//实现99乘法表
int n=9;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int result=i*j;
System.out.println(i+"*"+j+"="+result);
}
}
6.立方阶O(n3)
类似于平方阶,进行三层嵌套for循环
7.k次方阶O(nk)
类似于平方阶,进行k层嵌套for循环
8.指数阶O(2^n)
因为指数阶在n慢慢增大的时候,时间复杂度非常大,因此在日常使用中一定要避免使用这种算法。
空间复杂度:一个算法在运行过程中临时占有存储空间大小的度量,有的算法需要占用临时工作单元数与解决问题的规模n有关,他随着n的增大而增大,如快速排序和归并排序算法就属于这种情况。
算法分析时,更看重的是程序执行的速度,redis,memcache和有些算法(如:基数排序,桶排序)本质就是用空间换取时间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。