当前位置: 首页 > 后端技术 > Java

听说要滚算法

时间:2023-04-02 09:23:01 Java

今天的目标:1:能说出什么是数据结构,什么是算法2:能说出大O时间复杂度是怎么得来的3:能说出时间复杂度是多少一个分析原理和实际应用4:可以说出几种常见的时间复杂度O(1),O(n),O(logn),O(n*logn)5:可以理解空间复杂度分析方法1.概念虽然概念很空,概念还是要介绍一下:数据结构是指一组数据的存储结构,算法是操作数据的方法。要运走它,您是要找汽车还是卡车来运它?这是数据结构的范畴,选择什么样的结构进行存储;至于装货的时候是把货物堆在一起还是分开,这是算法的范畴,如何摆放货物效率更高,更节省空间。数据结构和算法看似是两个东西,为什么要把它们放在一起呢?那是因为数据结构和算法是相辅相成的。数据结构为算法服务,算法作用于特定的数据结构。因此,我们不能脱离数据结构来谈算法,也不能脱离算法来谈数据结构。.想要学习数据结构和算法,首先要掌握数据结构和算法中最重要的概念:复杂度分析2.复杂度分析。数据结构和算法解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码节省存储空间。因此,执行效率是一个非常重要的考量指标。如何衡量代码的执行效率,就是我们所说的:时间和空间复杂度分析。为什么要做复杂性分析?1:与性能测试相比,复杂性分析具有不依赖执行环境、成本低、效率高、易操作、指导性强等特点。2:掌握了复杂度分析,你将能够编写出性能更好的代码,有助于降低系统开发和维护成本。2.1.大O复杂度记法算法的执行效率,粗略的说就是算法代码的执行时间,那么不直接运行代码如何粗略计算出执行时间呢?在IDEA中创建一个普通的java项目:algo-pro在项目中创建一个类:com.iheima.complexity.ComplexityAnalysis(1)先看一小段代码,问:1,2,3,4……n累加和/***求1~n的累加和*@paramn*@return*/publicintsum(intn){intsum=0;for(inti=1;i<=n;i++){sum=sum+i;}returnsum;}假设每行代码的执行时间都是一样的:timer,那么这段代码的执行时间是多少:(3n+3)timer,由此可以看出,执行时间T所有代码的(n)与代码执行次数成正比。(2)按照这个思路,我们看下面这段代码publicintsum2(intn){intsum=0;for(inti=1;i<=n;++i){for(intj=1;j<=n;++j){sum=sum+i*j;}}returnsum;}同样,这段代码的执行时间为:(3n^2+3n+3)*timer所以有一个重要的结论:代码的执行时间T(n)与总执行次数,我们可以把这个规律总结成一个公式。T(n)=O(f(n))说明:T(n)表示代码的执行时间,n表示数据规模的大小,f(n)表示代码执行的总次数,这是一个公式,所以使用f(n)意味着O意味着代码执行时间与f(n)成正比,所以在第一个例子中T(n)=O(3n+3),在第一个例子中T(n)=O第二个例子(3n^2+3n+3),这是大O时间复杂度的表示法大O时间复杂度其实并不具体代表代码的真实执行时间,而是代表代码执行时间随时间的变化趋势数据规模的增长,因此也称为渐近时间复杂度,简称时间复杂度。当n很大时,公式中的低阶、常量、系数三部分不影响其增长趋势,可忽略不计。我们只需要记录一个最大幅度。因此,如果用大O来表示正好时间复杂度可以记为:T(n)=O(n),T(n)=O(n^2)2.2。复杂度分析方法的一般复杂度分析规则如下:(1)最大循环原则大O复杂度记号只代表一种变化趋势。公式中的低位、常量、系数部分不影响其增长趋势,可忽略不计。我们只需要记录一个最大幅度。因此,在分析一个算法或一段代码的时间复杂度时,只需关注循环执行次数最多的那段代码即可。(2)加法原理请分析以下代码的时间复杂度:publicintsum3(intn){intsum_1=0;诠释p=1;对于(;p<=100;++p){sum_1=sum_1+p;}intsum_2=0;intq=1;对于(;q=0;--i){System.out.println(a[i]);}}第二行代码申请了一个空间来存放变量i,但它是常量顺序的,与数据大小n无关。第三行申请了一个大小为n的int数组,另外下面的代码几乎没有占用空间,所以整个一段代码的空间复杂度是O(n)。我们常见的空间复杂度是O(1)、O(n)、O(n^2),其他的如对数阶等复杂度几乎用不到,所以空间复杂度比时间复杂度分析要简单很多,掌握这些就够了.本文由传智教育博学谷-狂野建筑师教研团队发布,转载请注明出处!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力