java时间复杂度计算_时间复杂度到底怎么算

article/2025/11/11 7:10:52

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。

那么我们应该如何去衡量不同算法之间的优劣呢?

主要还是从算法所占用的「时间」和「空间」两个维度去考量。

时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。

时间复杂度

一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或「时间频度」。记为T(n)。

时间频度T(n)中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律,为此我们引入时间复杂度的概念。算法的时间复杂度也就是算法的时间度量,记作:T(n) = O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称「时间复杂度」。

这种表示方法我们称为「 大O符号表示法」,又称为渐进符号,是用于描述函数渐进行为的数学符号

常见的时间复杂度量级有:

常数阶$O(1)$线性阶$O(n)$平方阶$O(n^2)$立方阶$O(n^3)$对数阶$O(logn)$线性对数阶$O(nlogn)$指数阶$O(2^n)$常数阶$O(1)$

$O(1)$,表示该算法的执行时间(或执行时占用空间)总是为一个常量,不论输入的数据集是大是小,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

99546284ab6ec8f37271357e211db251.png

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用$O(1)$来表示它的时间复杂度。

线性阶$O(n)$

$O(n)$,表示一个算法的性能会随着输入数据的大小变化而线性变化,如

bbc4bd56f0b581215da9b03af87083d0.png

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用$O(n)$来表示它的时间复杂度。

平方阶$O(n^2)$

$O(n)$ 表示一个算法的性能将会随着输入数据的增长而呈现出二次增长。最常见的就是对输入数据进行嵌套循环。如果嵌套层级不断深入的话,算法的性能将会变为立方阶$O(n3)$,$O(n4)$,$O(n^k)$以此类推

67ee76b866f167e60484d9a505446033.png

指数阶$O(2^n)$

$O(2^n)$,表示一个算法的性能会随着输入数据的每次增加而增大两倍,典型的方法就是裴波那契数列的递归计算实现

630f1b9ae4126ce6ccf70d4271f48f54.png

对数阶$O(logn)$

60d90639d5fdfec004ee0d7765aad5f1.png

上面的代码,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了,直到i不小于n退出。我们试着求解一下,假设循环次数为x,也就是说 2 的 x 次方等于 n,则由2^x=n得出x=logn。因此这个代码的时间复杂度为$O(logn)$

线性对数阶$O(nlogn)$

线性对数阶$O(nlogn) $,就是将时间复杂度为对数阶$O(logn)$的代码循环n遍的话,那么它的时间复杂度就是 n * O(logN),也就是了$O(nlogn)$,如下,

6b966598396f38992bc91f8ccd8922c8.png

除此之外,其实还有平均情况复杂度、最好时间复杂度、最坏时间复杂度。。。一般没有特殊说明的情况下,都是值最坏时间复杂度。

空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)),其中n为问题的规模,S(n)表示空间复杂度。

一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。

一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。当一个算法的空间复杂度与n成线性比例关系时,可表示为$0(n)$,类比时间复杂度。

空间复杂度比较常用的有:O(1)、O(n)、O(n)

空间复杂度 $O(1)$

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)举例:

2ecad2e9299389a9effd60b9a0c122ac.png

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

空间复杂度 $O(n)$

cf068e35795b7b25d6d7481b59541e09.png

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

复杂度速查表

图例

f85856bcdf46fc9292a4e65d1b91b530.png

大-O 复杂度曲线

d001e316d93085e92b84c9f6b70193ea.png

抽象数据结构的操作复杂度

7303a1aec1a17874caa4a30f2f999ddd.png

数组排序

fbf0654dc5a674d0e1c9957e6c5c8112.png

图操作

d6011a6ca2a576000079b9ed970bb7b2.png

堆操作

d84c10078a8838df64290749cf551112.png


http://chatgpt.dhexx.cn/article/X5yUPVCi.shtml

相关文章

Python 时间复杂度计算

一、时间复杂度 1 常见的时间复杂度 #常量阶O(1)# 对数阶O(logn)# 线性对数阶O(nlogn)# 线性阶O(n)# 平方阶,立方阶....M次方阶O(n^2),O(n^3),O(n^m)# 指数阶O(2^n)# 阶乘阶O(n!) 算法的时间复杂度对比&#xff1a; O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2lo…

树的时间复杂度

时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。常见的时间复杂度有以下几种。 1&#xff0c;log(2)n&#xff0c;n&#xff0c;n log(2)n &#xff0c;n的平方&#xff0c;n的三次方&#xff0c;2的n次方&#xff0c;n! 1指的是常数。即&#xff0c;无论算法…

时间复杂度和空间复杂度详解

算法时间复杂度和空间复杂度 1.算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一…

全排列的时间复杂度

我们在高中的时候都学过排列组合。“如何把 n 个数据的所有排列都找出来”&#xff0c;这就是全排列的问题。我来举个例子。比如&#xff0c;1&#xff0c;2&#xff0c;3 这样 3 个数据&#xff0c;有下面这几种不同的排列&#xff1a; 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1…

十分钟搞定时间复杂度(算法的时间复杂度)

目录 1、什么是时间复杂度&#xff1f; 2、时间复杂度的计算 &#xff08;1&#xff09;单个循环体的推导法则 &#xff08;2&#xff09;多重循环体的推导法则 &#xff08;3&#xff09;多个时间复杂度的推导法则 &#xff08;4&#xff09;条件语句的推导法则 3、习题…

时间复杂度

时间频率 一个算法执行所耗费的时间&#xff0c;从理论上是不能算出来的&#xff0c;必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试&#xff0c;只需知道哪个算法花费的时间多&#xff0c;哪个算法花费的时间少就可以了。并且一个算法花费的时间与算…

什么是时间复杂度?

时间复杂度&#xff08;Time complexity&#xff09;是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述&#xff0c;不包括这个函数的低阶项和首项系数。 常见的时间复杂度 常见的算法时间复杂度由小到大…

数据结构—1.时间复杂度

目录 前言 一、时间复杂度 二、大O表示法 三&#xff0c;实例介绍 例1&#xff1a;O(N^2) 例2&#xff1a;O&#xff08;1&#xff09; 例3&#xff1a;O(M N) &#xff08;重点&#xff09;例4&#xff1a;O&#xff08;N&#xff09; 例5&#xff1a;冒泡排序&#…

时间复杂度计算-例题集合

一、常数阶二、线性阶三、对数阶四、平方阶五、多个复杂度组合&#xff1a;顺序结构六、多个复杂度组合&#xff1a;选择结构七、多个复杂结构&#xff1a;嵌套结构八、递归 ) 一、常数阶 // 常数阶 int result 100; //运行程序只执行一次 result ; //执行一次System.out…

时间复杂度详解

目录 一. 时间复杂度概念 例题1: 二. 推导大O阶 三. 几种常见的时间复杂度: 3.1常数阶: 3.2线性阶: 例题2: 3.3对数阶 3.4 平方阶: ​编辑 例题3:​编辑 解题思路: 变式1: 3.5 总结 四、空间复杂度 4.1 空间复杂度O(1) 4.2空间复杂度O(n) 例题4&#xff1a;数字…

一套图 搞懂“时间复杂度”

写在前面&#xff1a; 这篇文章是在公众号&#xff1a; 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章&#xff0c;清晰明了。 所以拿来po出来 仅供学习交流&#xff0c;如侵则删。 现已将此文收录至&#xff1a; 《数据结构》C语言版 (清华严…

各位学弟学妹,别再看教材了,时间复杂度看这篇就好了

时间复杂度是学习算法的基石&#xff0c;今天我们来聊聊为什么要引入时间复杂度&#xff0c;什么是时间复杂度以及如何去算一个算法的时间复杂度 一、刻画算法的运行时间 某日&#xff0c;慧能叫来了一尘打算给他补习补习一下基础知识&#xff0c;只见克写了一段非常简单的代码…

pytorch—torch.tensor.scatter操作解析

torch.Tensor.scatter_(dim, index, src, reduceNone) 理解scatter操作: tensor_A.scatter_(dim, index, tensor_B): tensor_B的每个元素&#xff0c;都按照 index 被scatter&#xff08;可以理解为填充&#xff09;到目标tensor_A中。 (1) index和源tensor_B维度一致; (2) t…

python scatter参数详解_python matplotlib.scatter 用法

# -*- coding: utf-8 -*- #导入模块 from matplotlib import pyplot as plt import numpy as np import pprint from math import pi,sin A1np.array([0,0]) B1np.array(([2,0],[0,2])) #以 A1为均值&#xff0c;B1为协方差矩阵&#xff0c;生成正态分布的随机数 每次生…

pytorch scatter和scatter_详解

文章目录 0. Introduction1. 定义2. 详解例1例2 Reference&#xff1a; 0. Introduction scatter() 和 scatter_() 的作用是一样的&#xff0c;只不过 scatter() 不会直接修改原来的 Tensor&#xff0c;而 scatter_() 会 PyTorch 中&#xff0c;一般函数加下划线代表直接在原来…

Pytorch中scatter与gather操作

文章目录 数据发散scatter带聚集的发散scatter_add_onnx中scatterND数据聚集gather 数据发散scatter 函数原型pytorch官方文档scatter_&#xff1a; scatter_(dim, index, src) → Tensor注&#xff1a; scatter_是scatter的就地操作。 对于一个三维的张量来说&#xff0c;张…

pytorch中scatter()、scatter_()详解

scatter()、scatter_() scatter() 和 scatter_() 的作用一样。 不同之处在于 scatter() 不会直接修改原来的 Tensor&#xff0c;而 scatter_() 会在原来的基础上对Tensor进行修改。 torch.scatter()官方文档 scatter(dim, index, src)将src中数据根据index中的索引按照dim的…

torch_scatter.scatter()的使用方法详解

目录 1. 参数2. 示例2.1 简单示例2.2 顺序问题2.3 维度问题 1. 参数 具体来讲&#xff0c;scatter函数的作用就是将index中相同索引对应位置的src元素进行某种方式的操作&#xff0c;例如sum、mean等&#xff0c;然后将这些操作结果按照索引顺序进行拼接。下面我用具体的例子来…

torch.scatter

本文目录 一、函数简介二、二维举例三、详解执行过程1. 第一步2. 第二步3. 第三步4. 问题 一、函数简介 torch.scatter(input, dim, index, src) dim ([int]) – the axis along which to indexindex (LongTensor) – the indices of elements to scatter, can be either emp…

Python中的scatter

假设X与Y&#xff0c;其中X是5X2矩阵 关于X_demo[Y_demo0 , 0],是一种获取子矩阵的方式 因为Y_demo取值只是0与1&#xff0c;可以看做一个布尔数组&#xff0c; 在X_demo[取Y_demo中为0的行&#xff0c;只取第0列] 正好对应 而在scatter(横坐标&#xff0c;纵坐标) 现在已经…