Python 算法基础篇:时间复杂度和空间复杂度简介

news2024/12/24 9:34:47

Python 算法基础篇:时间复杂度和空间复杂度简介

  • 引言
  • 1. 时间复杂度
    • a ) 常见的时间复杂度
    • b ) 时间复杂度示例
  • 2. 空间复杂度
    • a ) 常见的空间复杂度
    • b ) 空间复杂度示例
  • 结论

引言

在学习和分析算法时,时间复杂度和空间复杂度是两个关键概念。它们帮助我们评估算法的性能和资源使用情况。本篇博客将为你介绍时间复杂度和空间复杂度的概念,并通过 Python 示例代码演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 时间复杂度

时间复杂度是衡量算法运行时间随输入规模增长的增长率。它表示了算法的时间开销,即算法运行所需的时间。时间复杂度通常使用大 O 符号表示法来表示。

a ) 常见的时间复杂度

常见的时间复杂度有以下几种:

  • O ( 1 ):常数时间复杂度,表示算法的执行时间不随输入规模的增长而变化。
  • O ( log n ):对数时间复杂度,表示算法的执行时间随着输入规模的增长而以对数方式增长。
  • O ( n ):线性时间复杂度,表示算法的执行时间与输入规模成线性关系。
  • O ( n ^ 2 ):平方时间复杂度,表示算法的执行时间与输入规模的平方成正比。
  • O ( 2 ^ n ):指数时间复杂度,表示算法的执行时间以指数方式增长。

b ) 时间复杂度示例

下面通过几个示例来演示时间复杂度的应用:

示例 1 :计算列表元素的和

def sum_of_list(lst):
    sum = 0
    for num in lst:
        sum += num
    return sum

# 示例使用
nums = [1, 2, 3, 4, 5]
result = sum_of_list(nums)
print("列表元素的和:", result)

代码解释:上述代码定义了一个 sum_of_list 函数,它接受一个列表 lst 作为输入,并使用 for 循环计算列表元素的和。该算法的时间复杂度是 O ( n ),因为它需要遍历整个列表。

在这里插入图片描述

示例 2 :二分查找算法

def binary_search(arr, target):
    left = 0
    right = len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

# 示例使用
arr = [1, 2, 3, 4, 5]
target = 3
index = binary_search(arr, target)
print("目标元素 {} 的索引是:{}".format(target, index))

代码解释:上述代码定义了一个 binary_search 函数,它使用二分查找算法在有序列表 arr 中查找目标元素 target 。该算法的时间复杂度是 O ( log n ),因为每次迭代都将问题的规模减半。

在这里插入图片描述

通过上述示例,我们可以看到不同算法的时间复杂度如何随着输入规模的增长而变化。理解算法的时间复杂度可以帮助我们选择合适的算法来解决问题,并评估算法的性能。

2. 空间复杂度

空间复杂度是衡量算法所需的额外空间随输入规模增长的增长率。它表示了算法所需的额外内存空间。空间复杂度通常使用大 O 符号表示法来表示。

a ) 常见的空间复杂度

常见的空间复杂度有以下几种:

  • O ( 1 ):常数空间复杂度,表示算法所需的额外空间是固定的。
  • O ( n ):线性空间复杂度,表示算法所需的额外空间与输入规模成线性关系。
  • O ( n ^ 2 ):平方空间复杂度,表示算法所需的额外空间与输入规模的平方成正比。

b ) 空间复杂度示例

下面通过几个示例来演示空间复杂度的应用:

示例 1 :生成斐波那契数列

def fibonacci(n):
    fib = [0, 1]
    for i in range(2, n+1):
        fib.append(fib[i-1] + fib[i-2])
    return fib[n]

# 示例使用
num = 10
result = fibonacci(num)
print("斐波那契数列的第 {} 个数是:{}".format(num, result))

代码解释:上述代码定义了一个 fibonacci 函数,它接受一个正整数 n 作为输入,并生成斐波那契数列中第 n 个数。该算法的空间复杂度是 O ( n ),因为它需要存储整个斐波那契数列。

在这里插入图片描述

示例 2 :递归算法

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

# 示例使用
num = 5
result = factorial(num)
print("{} 的阶乘是:{}".format(num, result))

代码解释:上述代码定义了一个 factorial 函数,它使用递归方式计算正整数 n 的阶乘。该算法的空间复杂度是 O ( n ),因为每次递归调用都需要在内存中保存函数的调用栈。

在这里插入图片描述

通过上述示例,我们可以看到不同算法的空间复杂度如何随着输入规模的增长而变化。理解算法的空间复杂度可以帮助我们评估算法的内存使用情况,并优化算法以节省内存。

结论

本篇博客介绍了时间复杂度和空间复杂度的概念,并通过多个 Python 示例代码演示了它们的应用。时间复杂度帮助我们评估算法的执行时间随输入规模增长的趋势,而空间复杂度帮助我们评估算法的额外内存使用随输入规模增长的趋势。

通过理解时间复杂度和空间复杂度,我们能够选择合适的算法来解决问题,并评估算法的性能和资源使用情况。这对于提高程序效率、优化资源利用以及设计高效的算法非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )

文章目录 一、函数形参类型注解1、函数中由于类型缺省导致的提示问题2、函数形参类型注解语法3、代码示例 - 函数形参类型注解 二、函数返回值类型注解1、函数返回值类型注解语法2、代码示例 - 函数返回值类型注解 一、函数形参类型注解 1、函数中由于类型缺省导致的提示问题 由…

LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

小程序api的promise化

小程序根目录cmd运行安装命令 npm install --save miniprogram-api-promise1.0.4 安装完成之后先到根目录中删除miniprogram_npm文件夹(不删除构建npm时可能会出现问题) 删除之后再在工具中点击构建npm 构建成功之后会看到根目录中重新出现了miniprogram_npm文件夹 在app.j…

P1747 好奇怪的游戏

好奇怪的游戏 题目背景 《爱与愁的故事第三弹shopping》娱乐章。 调调口味来道水题。 题目描述 爱与愁大神坐在公交车上无聊&#xff0c;于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘&#xff1a;***&#xff08;游戏名被打上了马赛克&#xff09;。这个游戏类似…

修复漏洞(三)升级Docker里面的镜像(MySQL、Nginx等)

前言 因原版本检测出来存在漏洞&#xff0c;故需升级底层镜像 步骤 先看看自己现在的是什么版本&#xff0c;教你们一个骚操作&#xff0c;查看Docker里面的Mysql或者其他容器版本都不用百度出来的这么麻烦首先docker images&#xff0c;查看镜像ID然后docker inspect 镜像I…

2、Java入门教程【IDEA】

1、下载 IDEA社区版&#xff1a;下载地址 IDEA管理JAVA程序的结构&#xff1a; project 项目、工程module 模块package 包class 类 2、创建工程 创建【project】 点击【create】后&#xff0c;项目结构如下&#xff1a; 创建【package】 我们继续在【src】目录下创建【pack…

Python中的break和continue语句应用举例

Python中的break和continue语句应用举例 在进行Python编程时候&#xff0c;有时需要&#xff0c;对循环中断或跳过某部分语句&#xff0c;此时常会用到break语句或continue语句。本文将通过实际例子阐述这两个语句的用法。 1.break语句 break语句是实现在某个地方中断循环&a…

js逆向补环境-b站志远二期最后8节课笔记

目录 一、基础知识1、什么是纯净V82、什么是BOM和DOM3、node环境/浏览器环境/V8引擎区别4、如何本地调试js补环境5、补环境相对于逆向算法的好处6、vm和vm2介绍 二、8个视频内容笔记概括1、补环境基本知识/头条案例手动插桩补2、Proxy代理/toString函数保护介绍3、补环境框架设…

安卓UI:Switch和ToggleButton

目录 一、Switch和ToggleButton介绍 Switch常用属性&#xff1a; ToggleButton属性&#xff1a; 二、Switch和ToggleButton常用方法 Switch常用方法&#xff1a; ToggleButton常用方法&#xff1a; 三、Switch和ToggleButton的使用 MainActivity: activity_main&#xff1…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 …

【C语言进阶(八)】动态内存管理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 动态内存规划 1. 前言2. 为什么要学…

ElasticSearch索引(index)当中的增删改查操作

文章目录 一、创建索引&#xff08;Create Index&#xff09;&#xff1a;二、更新索引的设置&#xff08;Update Index Settings&#xff09;&#xff1a;三、获取当前索引的设置&#xff08;Get Index Settings&#xff09;&#xff1a;四、删除索引&#xff08;Delete Index…

Python(十三)数据类型——整数类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

N!9个OA高危漏洞利用工具v1.1.6

工具介绍 该工具使用了ExpDemo-JavaFX项目&#xff0c;保留了核心的数据包请求接口&#xff0c;使用jdk1.8环境开发。目前只编写了oa系列&#xff0c;对相关漏洞进行复现和分析&#xff0c;极力避免exp的误报和有效性。 关注【Hack分享吧】工众号&#xff0c;回复关键字【2305…

基于linux下的高并发服务器开发(第一章)- fcntl函数

13 / fcntl函数 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ...); 参数&#xff1a; fd : 表示需要操作的文件描述符 cmd: 表示对文件描述符进行如何操作 - F_DUPFD : 复制文件描述符,复制的是第一个参数fd&#xff0c; …

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

Spring MVC 运行原理 【深度理解】

什么是MVC&#xff1f; MVC 是 Model、View 和 Controller 的缩写&#xff0c;分别代表 Web 应用程序中的 3 种职责&#xff0c;MVC是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码&#xff0c;降低了视图与业务逻辑之间的双向耦合。 Model(模型)&#xf…

newMap和newSet

newMap Map 对象存有键值对&#xff0c;其中的键可以是任何数据类型。Map字典是以[键&#xff0c;值]的形式存储** 1:键值对的键类型比较灵活 可以用任意类型的变量来做键名&#xff0c; 2 遍历键值对 for … in循环还有一些限制&#xff1a;它仅仅遍历可枚举属性、非Symb…

进程概念与进程控制

1.冯诺伊曼体系结构: 数据按照二进制存储 数据存储在存储器&#xff08;内存&#xff09;当中 输入设备 存储器 中央处理器 输出设备 2.操作系统&#xff1a; 先组织&#xff0c;再描述 系统调用与库函数&#xff1a; 系统调用 系统调用指运行在用户空间的程序向操作系统内核…

小程序-----vant weapp安装以及自定义主题色

首先查看小程序根目录中是否存在package.json文件 没有的话,在项目根目录打开cmd,输入npm init -y初始化一下,初始化一个包管理 安装vant weapp包 在根目录的cmd中输入npm i vant/weapp1.3.3 -S --production进行安装 后面可以指定版本 修改 app.json 将 app.json 中的 “…