// 算法一
public static void main(String[] args) {
int sum = 0;//执行1次
int n=100;//执行1次
sum = (n+1)*n/2;//执行1次
System.out.println(“sum=”+sum);
}
// 算法二
public static void main(String[] args) {
int sum = 0;//执行1次
int n=100;//执行1次
for (int i = 1; i <= n; i++) {
sum += i;//执行了n次
}
System.out.println(“sum=” + sum);
}
// 算法三
public static void main(String[] args) {
int sum=0;//执行1次
int n=100;//执行1次
for (int i = 1; i <=n ; i++) {
for (int j = 1; j <=n ; j++) {
sum+=i;//执行n^2次
}
}
System.out.println(“sum=”+sum);
}
如果忽略判断条件的执行次数和输出语句的执行次数,那么当输入规模为n时,以上算法执行的次数分别为:
-
算法一:3次
-
算法二:n+3次
-
算法三:n^2+2次
如果用大O记法表示上述每个算法的时间复杂度,应该如何表示呢?
基于我们对函数渐近增长的分析,推导大O阶的表示法有以下几个规则可以使用:
-
用常数1取代运行时间中的所有加法常数
-
在修改后的运行次数中,只保留高阶项
-
如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数
所以,上述算法的大O记法分别为:
-
算法一:O(1)
-
算法二:O(n)
-
算法三:O(n^2)
2、常见的大O阶
2.1、线性阶 O(n)
一般含有 非嵌套循环 涉及线性阶,线性阶就是随着输入规模的扩大, 对应计算次数呈直线增长
例如: 下面这段代码,它的循环的时间复杂度为 O(n),因为循环体中的代码需要执行n次
public static void main(String[] args) {
int sum = 0;
int n=100;
for (int i = 1; i <= n; i++) {
sum += i;
}
System.out.println(“sum=” + sum);
}
2.2、平方阶 O(n^2)
一般 嵌套循环 属于这种时间复杂度
下面这段代码,n=100,也就是说,外层循环每执行一次,内层循环就执行100次,那总共程序想要从这两个循环中出来,就需要执行100*100次,也就是n的平方次,所以这段代码 的时间复杂度是 O(n^2)
public static void main(String[] args) {
int sum=0,n=100;
for (int i = 1; i <=n ; i++) {
for (int j = 1; j <=n ; j++) {
sum+=i;
}
}
System.out.println(sum);
}
2.3、立方阶 O(n^3)
一般 三层嵌套循环 属于这种时间复杂度
下面这段代码,n=100,也就是说,外层循环每执行一次,中间循环循环就执行100次,中间循环每执行一次,最内层循环需要执行100次,那总共程序想要从这三个循环中出来,就需要执行100100100次,也就是n的立方,所以这段代码的时间复杂度是 O(n^3)
public static void main(String[] args) {
int x=0,n=100;
for (int i = 1; i <=n ; i++) {
for (int j = i; j <=n ; j++) {
for (int j = i; j <=n ; j++) {
x++;
}
}
}
System.out.println(x);
}
2.4、对数阶 O(logn)
int i=1,n=100;
while(i<n){
i = i*2;
}
由于每次 i*2 之后,就距离n更近一步,假设有x个2相乘后大于n, 则会退出循环。由于是2^x=n,得到x = log(2)n,所以这个循环的时间复杂度为 O(logn);对于对数阶,由于随着输入规模n的增大,不管底数为多少, 他们的增长趋势是一样的,所以我们会忽略底数
2.5、常数阶 O(1)
一般 不涉及循环操作 的都是常数阶,因为它不会随着n的增长而 增加操作次数。例如: 下述代码,不管输入规模n是多少,都执行2次,根据大O推导法 则,常数用1来替换,所以上述代码的时间复杂度为 O(1)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(img-NK0M1QYV-1712689804325)]
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
[外链图片转存中…(img-GUOlSCPH-1712689804325)]
关注我,点赞本文给更多有需要的人
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-miWKnu7V-1712689804325)]