首页 > 编程语言 >五分钟理解Java算法的时间复杂度

五分钟理解Java算法的时间复杂度

时间:2023-04-24 10:34:07浏览次数:46  
标签:Java int 复杂度 五分钟 算法 时间 执行 public

关注我了解更多Java技术知识,带你一路“狂飙”到底!上岸大厂不是梦!

前言
时间复杂度主要是为了反映函数的执行时间随着输入规模增长而变化的规律,在一定程度上可以体现程序的执行效率和算法的优劣。作为程序员,掌握基本的算法时间复杂度的计算是很有必要的。

时间复杂度介绍
理论上,执行一个算法消耗的时间,是无法精确计算的,即使上机测试,收到各种因素影响,得到的时间也可能有较大差别。对于程序员,我们只需关注哪个算法花费的时间多,哪个算法花费的时间少就可以了。

针对执行时间,我们可以根据算法执行的语句的次数,进行一个简单的衡量。理论上,一个算法中语句执行次数多,它花费时间相对也多,因此,算法运行的时间与算法中语句的执行次数成正比。我们将算法中的语句的执行次数称为时间频度,表示为T(n),其中,n表示算法的输入规模,n的变化会引起T(n)的改变。

为了得到T(n)变化时表现的规律,我们引入时间复杂度的概念。若有某个函数f(n),当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,表示为T(n)=O(f(n)),O(f(n))称为算法的渐进时间复杂度,简称时间复杂度。

举例说明如何得到时间复杂度
场景1:

public int func() {
int a = 10 + 20; // 执行 1 次
return a; // 执行 1 次
}
T(n) = 1 + 1 = 2

由于是常数,时间复杂度为O(1)

场景2:

public void func() {
int n = 10; // 执行1次
for(int i = 0; i < n; i++) { // 执行 n 次
System.out.printf(i); // 执行 n 次
}
}
T(n) = n + n + 1 = 2n + 1

忽略常数项1,忽略和最高阶相乘的常数2,得到时间复杂度O(n)

其实,还可以先计算每个语句的时间复杂度,然后汇总:

public void func() {
int n = 10; // 时间复杂度O(1)
for(int i = 0; i < n; i++) { // 时间复杂度O(n)
System.out.printf(i); // 时间复杂度O(1)
}
}
O(1 * n * 1) = O(n)

场景3:

public int func(int n) {
for(int i = 0; i < n; i++) { // 执行n次
for(int j = 0; j < n; j++) { //由于外层循环,该语句执行 n * n 次
System.out.printf("Hello"); // 同理,执行n*n次
}
}
}
T(n) = n + n^2 + n^2 = 2n^2 + n

忽略低阶项,和高阶项的常数部分,得到时间复杂度O(n^2)

场景4:

public int func(int n) {
for(int i = 0; i < n; i = i* 2) { // i=2,4,8,16...时执行,可通过对数近似计算次数,执行log2(n)次
System.out.printf("Hello");
}
}
T(n) = 2log2(n)

忽略常数部分,得到时间复杂度O(log2(n))

总结
计算时间复杂度时,可以先先计算 T(n),然后忽略常数项,只保留最高次项,同时忽略最高项的系数,得到函数 f(n),则算法的时间复杂度就是 O(f(n))。

标签:Java,int,复杂度,五分钟,算法,时间,执行,public
From: https://www.cnblogs.com/qian-fen/p/17348686.html

相关文章

  • Java-Day-14( 枚举 + 注解 + 自设头文件 )
    Java-Day-14枚举(enumeration,enum)若是创建春夏秋冬四季的信息,如果按传统方法创建,无法固定信息,可以随时调改,所以要用枚举,做到只读且不能改枚举一组常量的集合——属于一种特殊的类,里面只包含一组有限的特定的对象实现方式自定义类实现枚举构造器私有化......
  • Java 常见报错解决方案
    1.常见的java异常分类Throwable类有两个直接子类:Exception:出现的问题是可以被捕获的Check异常:派生自Exception的异常类,必须被捕获或再次声明抛出Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象thrownewArithmeticException(…);......
  • 力扣977(Java)-有序数组的平方(简单)
    题目:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]示例2:输入:nums=[-7,-3,2,3,11]输出:[4,......
  • IDEA中JavaDocs路径是红色的
    转载链接:https://blog.csdn.net/Chia_Hung_Yeh/article/details/102936633ProjectSettings-->Libraries-->Sources、JavaDocs路径出现红色字体ClassesClasses中的jar,是程序在运行项目的时候使用的,因为这个是直接编译好的class文件,可以直接被虚拟机运行的。SourcesSource......
  • java -- 枚举和反射
    枚举枚举概述枚举是JDK1.5新增的引用数据类型,和类,接口是一个级别的,定义枚举的关键字为enum。java.lang.Enum类,是所有枚举的父类。枚举的本质就是一个类的多个对象。枚举的定义格式:publicenmu枚举名{}枚举常量定义:枚举中的常量名字大写,多个常量之间逗号分开,最后一个常......
  • Javascript数据类型
    值类型和引用类型原始类型(alias:值类型,基础类型)primitive:stringnumberbooleannullundefinedsymbol引用类型:Object其他内置Object派送类型ArrayFunctionMapSetWeakMapWeakSetRegExpNaN:特殊的Number类型,IsNaN()判断一个值是否为NaN引用类型可以有......
  • java调用GDAL,接口运行一次出现A fatal error has been detected by the Java Runtime
    参考文章:https://www.jianshu.com/p/4bffe29e3a02问题描述:通过调用GDAL写的SpringBoot接口,第一次访问成功,第二次报错,显示报错的位置为gdal库。尝试了很多方法https://www.cnblogs.com/jokingremarks/p/15132599.html#!comments仍然不成功,感觉应该是第二次运行接口时,进行垃圾回......
  • Java实验七
    1packageJavashiyan7a;2publicclassBikeimplementsVehicle{3@Override4publicvoidstart(){5System.out.println("Bikestart");6}78@Override9publicvoidstop(){10System.out.println......
  • Java学习笔记(四)
    1、break、continue、return的区别(1)break常在switchcase中使用,也可以在循环中使用。作用:当遇到break,则结束当前整个switchcase语句或者当前整个循环。执行外面语句。(2)continue:只能在循环中使用。作用是结束当前这一次循环,执行下一次循环。(3)return:在方法中使用,作用是结束当前......
  • java脚本读取finalshell密码
    在finalshell安装目录下找到coon文件夹,下面有许许多多的json文件,在这些文件中找到password{"forwarding_auto_reconnect":false,"custom_size":false,"delete_time":0,"secret_key_id":"","user_name":"root","remote_port_......