Python 时间复杂度计算

article/2025/11/11 7:12:07

一、时间复杂度

1 常见的时间复杂度

  • #常量阶O(1)
  • # 对数阶O(logn)
  • # 线性对数阶O(nlogn)
  • # 线性阶O(n)
  • # 平方阶,立方阶....M次方阶O(n^2),O(n^3),O(n^m)
  • # 指数阶O(2^n)
  • # 阶乘阶O(n!)

算法的时间复杂度对比:

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

其中,算法的时间复杂度越低,算法的效率越高。

 2 时间复杂度的计算过程中的忽略原则

  • 加法常数项可以忽略
  • 除去最高阶项,其它次项可以忽略
  • 与最高次项相乘的常数可以忽略

3 大O计法

        表示方法:T(n)=O(f(n))

        该公式中的O表示代码的执行总时间T(n)和其执行总次数f(n)成正比。这种表示法,称之为大O记法。大O记法T(n)=O(f(n)),表示随着代码执行的次数增长(减少),算法执行时间的增长率和f(n)的增长率相同,表示的是算法的渐近时间复杂度,简称时间复杂度。

二、时间复杂度分析案例

1 常量阶O(1)

1.1 案例1

# 常数阶1
num = 1  # 只执行一次
num = num + n  # 只执行一次
print(num)  # 只执行一次

分析:

        f(n)是指算法中所有语句的执行次数,这里便是f(n)=3,时间复杂度为O(f(n)),所以应该为O(3),可是为什么用O(1)表示呢?这里就是大O表示的法第一条即“用常数1等价替代不受数据规模影响的基本操作”。 

2 对数阶O(logn)

2.1 案例1

# 对数阶1
i = 1
while i <= n: i = i * 2

分析:

        

         所以求出x的值,就知道执行多少次了 ,也就是2x次幂=nx=log2n就是时间复杂度。显然就是O(log2n)。而所有对数的时间复杂度都表示为O(logn), 因为log2n=log3n/log32=log23*log3n,根据忽略原则中的“与最高次项相乘的常数可以忽略”,则可以表示为log2n=log3n,而当n为无穷大的时候,底数是2或者3都没有什么意义,所以统一表示为logn。

        根据乘法法则,如果一段代码的时间复杂度为O(logn),循环执行n遍,时间复杂度就是O(nlogn),即线性对数阶O(nlogn)也是非常常见的时间复杂度,如归并排序,快速排序。

对数公式:

2.2 案例2

# 对数阶2
n = 8
count = 0
while n>1:n = n//2count += 1
print('程序共被执行了:',count,'次')

分析:

        程序一共被执行了3次,也是x=log2n,即时间复杂度为 O(logn)。

3 线性对数阶O(nlogn)

# 线性对数阶
for j in range(n):i = 1while i <= n:i *= 2

4 线性阶O(n)

4.1 案例1

sum = 0 # 只执行一次
for i in range(0, n):  # 执行n次count = count + 1  # 执行n次

分析:

        上面代码执行的总次数为:f(n) = 1 + n + n;所以时间复杂度为T1(n) = O(2*n + 1)。当n趋近于无穷大时,T1(n) = O(n); 

4.2 案例2

# 线性阶举例2
count = 0 # 只执行一次
sum = 0 # 只执行一次for i in range(0, n):  # 执行n次count = count + 1  # 执行n次for j in range(0, n):  # 执行n次sum += j # 执行n次sum += 2*j # 执行n次

分析:

        增加前(即4.1)时间复杂度为:T1(n) = O(2n + 1),增加部分的代码执行次数f(n) = 1 + n + n + n;所以增加的代码时间复杂度T2(n) = O(3n + 1);因为代码是平行增加的所以增加后的时间复杂度T(n) = T1(n) + T2(n) = O(5*n + 2)。当n趋近于无穷大时,T(n) = O(n);

加法法则:如果算法的代码是平行增加的,则只需加上所对应的时间复杂度。

可以总结为:设T1(n)=O(f(n)),T2(n)=O(g(n)),则 T1(n)+T2(n)=O(max(f(n), g(n)))

5 平方阶O(n^2)

5.1 案例1

#平方阶举例1
n = 5
sum = 0  # 执行一次
for i in range(0, n):  # 执行n次b = 2 * i  # 执行n次for j in range(0, n):  # 执行n*n次sum += i + j  # 执行n*n次

分析:

        分析得出上面代码执行的总次数f(n) = 1 + n + n + nn + nn = 2n²+2n+1 。因此可以推出时间复杂度T(n) = O(2n²+2n+1 )。当n趋近于无穷大时,T(n)的增长主要与n²有关系,所以我们通常也将上述代码的时间复杂度写为T(n) = O(n²);

5.2 案例2

#平方阶举例2
sum = 0 # 只执行一次
for i in range(0, n):  # 执行n次count = count + 1  # 执行n次for j in range(0, m): # 执行n*m次count = count + 1  # 执行n*m次

分析:

        上面代码在4.1上增加了一个内层循环,增加的部分如果单独看,则执行了m次,但是由于是嵌套增加的,所以当外层循坏执行一次,内层循环就会执行m次。所以当外层循环执行n次时,内层循环就会执行n*m次,所以下面代码执行的总次数f(n) = 1 + n + n + nm + nm。由时间复杂度O的定义可计算出下面代码的时间复杂度T(n) = O(2nm + 2n + 1)。当n和m趋近于无穷大时,可以认为n=m,则可以写为T(n) = O(2n² + 2n + 1)。由于n和m趋近于无穷大,所以T(n)的增长主要受n²的增长影响,所以可以写为T(n) = O(n²)

乘法法则:如果算法的代码增加的是循环内的嵌套或者函数的嵌套,那么就需要乘上相应的时间复杂度。

可以总结为:设T1(n)=O(f(n)),T2(n)=O(g(n)),则 T1T2=O(f(n)g(n))

6 立方阶O(n^3)

6.1 案例1

n = 5
count = 0
for i in range(n):for j in range(n):for k in range(n):count += 1
print('程序共被执行了:',count,'次')

6.2 案例2

# 指数阶 递归
n = 6
def fib(n):if n<2:return nreturn fib(n-1)+fib(n-2)
print('斐波拉契',n,'为:',fib(n))

分析: 

三、练习题

n是描述问题规模的非负整数,下面程序片段的时间复杂度是()。

x = 2
while x < n/2 :x = 2*xprint(x)

A. O(log2n)    B. O(n)    C. O(nlog2n)    D. O(n2)

分析:

        在程序中,执行频率最高的语句为“x=2*x”。设该语句共执行了 t次,则2t+1=n/2,故t=log2(n/2)-1=log2n-2,得 T(n)=O(log2n)。故选A.

求整数n (n>=0)阶乘的算法如下,其时间复杂度是( )。

# 习题2
def fact(n):if n<=1:return 1return n*fact(n-1)

A. O(log2n)    B. O(n)    C. O(nlog2n)     D. O(n2)

分析:

         本题是求阶乘n!的递归代码,即n*(n-1)*...*1共执行n次乘法操作,故T(n)=O(n)

计算下面的时间复杂度:

# 习题3
i = 1
while i <= n:i = i * 3

分析:

        即为O(log3n),所有对数的时间复杂度都为O(logn)。 

四、参考

1.https://blog.csdn.net/weixin_40006977/article/details/110548314

2.Python常用算法之时间复杂度_假书生@的博客-CSDN博客_python 时间复杂度 

3.

时间复杂度和空间复杂度(Python)_狂奔的菜鸡的博客-CSDN博客_时间复杂度python

4.「Python语言进阶」算法复杂度是什么?如何估算?

5.数据结构与算法分析——对数时间复杂度的算法_ikilig404的博客-CSDN博客_对数运算时间复杂度

6.

数据结构与算法 --时间复杂度分析(二)_star_chao的博客-CSDN博客

7.数据结构(二)——时间复杂度+例子分析(相当清晰)_程序猿成长轨迹的博客-CSDN博客_数据结构时间复杂度例子

8.

数据结构——时间复杂度_ZJH_12138的博客-CSDN博客_数据结构时间复杂度

 


http://chatgpt.dhexx.cn/article/7ZvIm2HM.shtml

相关文章

树的时间复杂度

时间复杂度是一个函数&#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;纵坐标) 现在已经…

scatter python_Python中scatter()函数--转载

原博文 2017-05-13 20:46 − 原博地址:http://blog.csdn.net/anneqiqi/article/details/64125186 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1、scatter函数原型 2、其中散点的形状参数marker如下:... 相关推荐 …