问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java算法入门以及常见时间复杂度的推导

发布网友 发布时间:2024-09-26 17:35

我来回答

1个回答

热心网友 时间:2024-10-04 11:28

本文详细介绍了算法的入门知识,比如算法的定义,以及算法的时间复杂度推导和常见算法的时间复杂度。

1 算法定义

通俗的说,算法是描述解决问题的方法。在计算机领域中,算法可以说是一组完成任务的指令,计算或者解决问题的步骤,因此,任何代码片段都可视为算法。

2 算法的特性

算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。

2.1 输入输出

输入和输出特性比较容易理解,算法具有零个或多个输入。尽管对于绝大多数算法来说,输入参数都是必要的,但对于个别情况,如打印“helloworld!”这样的代码,不需要任何输入参数,因此算法的输入可以是零个。算法至少有一个或多个输出,算法是一定需要输出的,不需要输出,你用这个算法干吗?输出的形式可以是打印输出,也可以是返回一个或多个值等。

2.2 有穷性

有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。现实中经常会写出死循环的代码,这就是不满足有穷性。当然这里有穷的概念并不是纯数学意义的,而是在实际应用当中合理的、可以接受的“有边界”。你说你写一个算法,计算机需要算上个二十年,一定会结束,它在数学意义上是有穷了,可是媳妇都熬成婆了,算法的意义也不就大了。

2.3 确定性

确定性:算法的每一步骤都具有确定的含义,不会出现二义性。算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。算法的每个步骤被精确定义而无歧义。

2.4 可行性

可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。可行性意味着算法可以转换为程序上机运行,并得到正确的结果。尽管在目前计算机界也存在那种没有实现的极为复杂的算法,不是说理论上不能实现,而是因为过于复杂,我们当前的编程方法、工具和大脑限制了这个工作,不过这都是理论研究领域的问题,不属于我们现在要考虑的范围。

3 算法时间复杂度3.1 算法时间复杂度定义

对于同一个问题的不同解决算法,应选择效率最高的算法,以最大限度地减少运行时间或占用空间,对于运行时间的计算就是计算算法的时间复杂度。

以n表示算法需要执行的操作数(规模),在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,又称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

这样用大写O()来体现算法时间复杂度的记法,我们称之为大O表示法。O这个符号的意思是“忽略重要项以外的内容”,读音同Order。

算法的速度指的并非时间,而是操作数的增速,一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

3.2 大O的推导

如何推导一个算法的时间复杂度大O呢?这里有几条规则:

用常数1取代运行时间中的所有加法常数。

在修改后的运行次数函数中,只保留最高阶项。

如果最高阶项存在且不是1,则去除与这个项相乘的常数。

考虑n 变大的情况。去除其他影响较小的部分,保留最大的部分。

实际上最重要的还是程序员的思维,如何得到运行次数的表达式,这需要一定的数学功底,比如求数列的通项公式!

3.3 常见时间复杂度介绍

下面是常见的大O运行时间复杂度:

O(1),也叫常数时间,例如通过索引查找数组元素。

O(log n),也叫对数时间,这样的算法包括二分查找。

O(n),也叫线性时间,这样的算法包括简单查找。

O(n log n),也叫线性对数时间,这样的算法包括快速排序。

O(n?),也叫平方时间,这样的算法包括选择排序。

O(n?),也叫立方时间,不常见。

O(2^n^),也叫指数时间,不常见。

O(n!),也叫阶乘时间,这样的算法包括旅行商问题的解决方案,包括写出1~n的所有全排列,不常见。

O(n^n^),也叫完全平方时间,时间复杂度最高,不常见。

时间复杂度耗费时间从小到大排序如下:

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2^)<O(n^3^)<O(2^n^ ) <O(n!)<O(n^n^)

3.3.1 O(1)

案例:求1+2+3+……+n的和?

针对上面的案例,我们可以写出时间复杂度为O(1)的非常快速的算法代码:

/***案例1:求1+2+3+4+……+n的和*使用高斯算法,无论n为多少,只需要下面一个步骤就能求出和,算法的时间复杂度为O(1)*/privatestaticlongO1(intn){longsum=(1+n)*n/2;returnsum;}

代码中的完整时间复杂度为n(1+1),根据大O推导规则“用常数1取代运行时间中的所有加法常数”,因为最终时间复杂度为O(1)。

3.3.2 O(n)

线性时间的一般出现在循环结构中,并且相比常数时间O(1)会复杂很多,我们需要分析循环次数。

在上面的案例中,如果我们不采用高斯算法,而采用普通循环算法,那么算法的时间复杂度就是O(n),即线性时间,意思是n为多少,就需要执行多少步!

下面的代码中,完整时间复杂度为O(1+n+1),根据大O推导规则“考虑n 变大的情况。去除其他影响较小的部分,保留最大的部分”,这里的O(1+n+1)中2始终不变,n越大时2的影响力就越小,因此去除常数2,最终时间复杂度为O(n)。

/***案例2:求1+2+3+4+……+n的和*使用传统循环相加算法,n为多少,需要循环多少次,排除*算法的时间复杂度为O(n),线性时间,算法效率明显要低于高斯算法*/privatestaticlongO2(intn){longsum=0;//n为多少,这里就需要循环多少次for(inti=1;i<=n;i++){sum+=i;}returnsum;}3.3.3 O(logn)

当数据增大n倍时,耗时增大logn倍。

我们的二分查找,它的时间复杂度就是O(logn),此时默认以2为底数。这里有个更简单案例:

/***案例3:对于2的x次方值n,求x的值是多少*采用下面的循环算法,循环逼近.*该算法可以换算为,有多少个2相乘后等于n,则会退出循环。由2^x=n得到x=log2n。*这个x就是时间复杂度,所以这个算法的时间复杂度为O(logn)。*/privatestaticlongO3(intn){longm=1;longx=0;while(m==n){//下面两句话看成一段时间复杂度为O(1)的循环程序步骤,需要执行logn次x++;m*=2;}returnx;}

案例中总的时间复杂度为O(logn+3),考虑n 变大的情况。去除其他影响较小的部分,保留最大的部分,去除常数3,那么最终结果就是O(logn)

3.3.4 O(n?)

当n足够大的时候,n的线性增长,复杂度将沿平方增长。

选择排序的算法时间复杂度就是O(n?),求两个无序数组的交集时间复杂度也是O(n?)。下面来看更简单例子:

/***案例4:O(n^2)*输入为n时,需要执行n^2次内层的计算*/privatestaticlongO4(intn){longsum=0;longn2=n^2;for(inti=0;i<n2;i++){/*时间复杂度为O(1)的程序步骤*/sum+=i;}returnsum;}

案例中总的时间复杂度为O(n?+3),考虑n 变大的情况。去除其他影响较小的部分,保留最大的部分,去除常数3,那么最终结果就是O(n?)。

3.4 复杂语句的时间复杂度推导3.4.1 多重循环

对于多重循环,假设循环体的时间复杂度为 O(n),各个循环的循环次数分别是a, b, c...,则这个循环的时间复杂度为 O(n×a×b×c...)。分析的时候应该由里向外分析这些循环。

privatestaticvoidO5(intn){for(inti=0;i<n;i++){for(intj=i;j<n;j++){/*时间复杂度为O(1)的程序步骤序列*/}}}

我们来找一找n和时间复杂度的规律:由于当i=0时,内循环执行了n次,当i=1时,执行了n-1次,……当i=n-1时,执行了1次。所以总的执行次数为:

然后使用大O推导的方法:“只保留最高阶项”,那么去除n/2;“去除这个项相乘的常数“,也就是去除1/2,最终这段代码的时间复杂度为O(n^2^)。

3.4.2 顺序语句

对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度:

privatestaticlongO6(intn){//1次longsum=0;//n次for(inti=0;i<n;i++){/*时间复杂度为O(1)的程序步骤序列*/}//n(n+1)/2次for(inti=0;i<n;i++){for(intj=i;j<n;j++){/*时间复杂度为O(1)的程序步骤序列*/}}//1次returnsum;}

此时时间复杂度为O(n^2^)。

3.4.3 条件判断语句

对于条件判断语句,总的时间复杂度等于其中 时间复杂度最大的路径 的时间复杂度。

privatestaticvoidO7(intn){if(n==1){//n次for(inti=0;i<n;i++){/*时间复杂度为O(1)的程序步骤序列*/}}else{//n(n+1)/2次for(inti=0;i<n;i++){for(intj=i;j<n;j++){/*时间复杂度为O(1)的程序步骤序列*/}}}}

此时时间复杂度为 O(n^2^)。

3.4.4 递归

求第n项斐波那契数列的值,我们常用的方法是递归,因为看起来比较简单,如下:

privatestaticlongO8(intn){if(n<=1){return1;}else{returnO8(n-1)+O8(n-2);}}

现在求它的时间复杂度。显然运行次数n小于等于2时,a(0) = a(1) = 1;n大于等于2时a(n) = a(n - 1) + a(n - 2) + 1,这里的 1 是其中的加法算一次执行。我们可以把常数1省略,就变成了T(n) = T(n - 1) + T(n - 2),这明显是一个递推数列。

我们利用线性代数来求解,上面的线性递推数列的特征方程为:x^2=x+1,可以求得如下解:

那么

因为a1=1,a2=1,则有

解得

所以斐波那契数列的通项公式a(n)为:

也就是采用递归方式求第n项斐波那契数列的值的时间复杂度,可以看出来这是一个指数级的时间复杂度,相当的耗费时间,n稍微大一点基本上程序就会挂掉。

从上面我们也能看出来:

求复杂的时间复杂度需要大学数学的知识了;

代码中慎用递归。

4 最坏情况与平均情况

一个算法具体的时间复杂度可能不是固定的,比如,我们顺序查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置上待着,那么算法的时间复杂度就是O(n),这是最坏的一种情况了。

对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度。平均运行时间很难通过分析得到,一般在没有特殊说明的情况下,都是指最坏时间复杂度。我们的O表示的时间复杂度就是最坏时间复杂度。

5 算法空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1),而一般的递归算法就要有O(n)的空间复杂度了。

通常,我们都使用“时间复杂度”来指运行时间的需求,使用“空间复杂度”指空间需求。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。当不用限定词地使用“复杂度”时,由于空间复杂度难以计算,通常都是指时间复杂度。

作者:刘Java

怎样表示算法的时间复杂度?

1.空间复杂度:比如java中int是4个字节,long是8个字节,你可以用long表示一个数字,long a=100,同样可以用int b=100;这样我们用int肯定比long要节省空间,再者就是同样让许多人编写一个C程序,其中用的变量的个数可能大不一样,变量越多可能你的程序越容易让别人看懂,但变量越少,程序可能看懂的人不多...

非结构化数据如何可视化呈现?

通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准...

java 时间复杂度问题

第一个:包括两个for循环,问题规模是O(n*(n/2));后面的那个是O(n),两者加起来O(n*(n/2))+O(n)≈O(n*(n/2))≈O(N^2);第二个:是个while循环,表面看起来也应该是O(n),但由于变量j每次增加一倍,问题规模缩小为原来的一半,知道二分查找么?对,这根那个是一样的效率,都是O...

时间复杂度怎么算例题

&lt;1&gt;直接简单递归调用:f(n){...a1*f((n-k1)/b1);...};&lt;2&gt;直接复杂递归调用:f(n){...a1*f((n-k1)/b1);a2*f((n-k2)/b2);...};&lt;3&gt;间接递归调用:f(n){...a1*f((n-k1)/b1);...},g(n){...a2*f((n-k2)/b2);...}。2.递归算法效率分析方法 递归算法的分...

快速排序的算法复杂度分析

以下是快排的java算法:大家都知道快排的时间复杂度是O(n*ln[n]),那么这个复杂度是如何计算出来的呢?最好的情况下,每次划分对一个记录定位后,要记录的左侧子序列与右侧子序列的长度相同。在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,所需的时间为O(n)。设 是对n个记录的...

常量时间和线性时间指什么【java

与java无关,这应该是算法的相关知识,是用来描述算法时间复杂度的。时间复杂度,即是说你运行程序所花费的时间和你输入参数之间的关系。比如说一个程序,要求你输入一个数N,然后打印一遍“哈哈”俩字。输入的数和打印的结果没有啥联系,但单纯的从时间复杂度的角度来看,N取1和取1000,程序的运行...

X分之3.6等于3分之二节比例?

常见的时间复杂度比较。 如果这些您都已经知道了,可以不用耽误时间看了。 约定: 文中的n2表示的是n的2次方(n²),n^2也是表示n的2次方; n3表示的是n的3次方; n^k表示的是n的k次方; long2n表示的是以2为底的对数。 本文出自:凯哥Java(微信:kaigejava)学习Java版数据结构与算法笔记。 一:介绍 排序又...

蓝桥杯java软件开发考什么

-熟悉常见算法,包括排序、查找、递归等。-能够分析算法的时间复杂度和空间复杂度。4.Java标准库的使用:-熟练运用Java标准库中的各种类和方法,包括集合框架、输入输出等。-能够解决实际问题,合理使用库函数提高开发效率。5.网络编程:-了解Java网络编程的基本原理和操作,包括Socket编程。-能够实现简单的...

自学java最起码要学到什么程度?

其次,拥有扎实的计算机基础同样不可忽视。这包括对数据结构的深刻理解,如数组、链表、树、图等,以及对算法的原理有清晰的认知,例如快速排序的时间复杂度和极端情况下的表现。理解算法的时间复杂度有助于优化代码效率,而良好的代码健壮性则依赖于对可能的bug有高度的警觉性。要达到专业水平,可以尝试...

如何测试java程序的时间复杂度

具体情况具体分析,如 for(i=1;i&lt;n;i++)for(j=1;j&lt;n;j++){ ...} 上面这段的时间复杂度就是O(n*n),即n的平方

计算机考试二级具体考什么内容?

一、基本数据结构与算法 1.算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)。 2.数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。 3.线性表的定义;线性表的顺序存储结构及其插入与删除运算。 4.栈和队列的定义;栈和队列的顺序存储结构及其基本运算。 5...

算法时间复杂度的计算 算法的时间复杂度与什么有关 一个算法的时间复杂度为 各种算法的时间复杂度 各种排序算法的时间复杂度 算法的时间复杂度是指什么 算法的时间复杂度取决于什么 归并排序的时间复杂度推到 冒泡排序的时间复杂度推到
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑开机后显示器黑屏键盘灯不亮主机红灯不亮无滴声 电脑开机蓝灯亮红灯不亮,键盘鼠标没反应,显示器打印机只有电源无反_百 ... 笔记本电脑黑屏,按电源键或拔插销都不能关机,其他按键也都没反应,求... ...器就黑屏,而且显示器开关不停的闪烁,试过拔掉插销,但是还是那样的情 ... 三人自驾若尔盖3天消费多少,三天若尔盖旅游路线 十几分钟就死机黑屏,主机还在转,还不能重启,只能拔插销 电脑开机就工作,然后黑屏,关不上机器,得拔插销。 老是黑屏,主机还运转,网线指示灯不亮了,重启不了,只有拔插销。根本没... ...就是之前突然黑屏了再开就开不聊了主机箱的灯不亮这是什么能否告诉我... 腾讯全民WiFi有游戏加速功能吗 Java把一个数组int[][]b3=newint[][]{{1,2,3},{2,1},{3,4}};的所有... java中Applet程序中inti()start()run()方法是什么意思 企业信息查询平台大比拼:天眼查、爱企查、企查查、启信宝 企业词条启信宝可以不要吗 红掌的红花不往开展 PPR水管缺口怎样处理 套管如何堵漏 石棉绒堵漏方法 涉警网络舆情消退期的错误做法 参鹿补虚胶囊 参鹿补虚胶囊主治及用法 火碱一般什么地方有卖 80岁老人肾衰能活多久,他现在每天一日三餐都吃的 男生总是盯着我看什么意思? 警察如何运用网络畅通民意互动渠道 黎黄陂路珞珈碑路公寓群 黎黄陂路街头博物馆基本简介 绿豆莲子粥是如何制作的? 求类似BOSS或三角迷踪的日剧(推理悬疑) 番石榴茶什么时候喝好 番石榴茶的正确喝法 人忍耐极限是什么意思啊 人类极限是什么意思啊? 人体极限(关于人体极限的基本详情介绍) 汽车胶条多久换一次合适 为什么手机里微信保存的图片不能显示? 为什么微信拍照保存在相册里面不显示了? 怎么用电视连接WiFi? 听泉鉴宝是骗子嘛 听泉鉴宝到底什么来历? - 知乎 请问涤棉,全棉,全涤的布怎么区别的,用肉眼或触觉可以区分开来吗... 高三党想要复习数学,都有哪些办法? 乔姓孩子选名字大全集2024 乔姓男宝宝起名最高分 2024年3月6号出生乔姓宝宝取名叫什么 2024年3月11号出生乔姓宝宝取名叫什么 2024年3月8号出生乔姓宝宝取名叫什么 乔姓女宝宝五行带木最常用名字2024龙年 有哪些技巧能使青椒酿肉更下饭? 有哪些方法能使青椒酿肉更好吃? 有哪些妙招能使青椒酿肉更好吃? 5个边长为1的正方形拼成如图阴影部分,如果将其剪开,能不能拼成正方形...