Python 算法基础篇:大O符号表示法和常见时间复杂度分析

Python 算法基础篇:大 O 符号表示法和常见时间复杂度分析

  • 引言
  • 1. 大 O 符号表示法
    • a ) 大 O 符号的定义
    • b ) 示例代码
  • 2. 常见时间复杂度分析
  • 总结

引言

在分析和比较算法的性能时,时间复杂度是一项重要的指标。而大 O 符号表示法是用来描述算法时间复杂度的常见表示方法。本篇博客将为你介绍大 O 符号表示法的概念以及常见的时间复杂度分析,同时通过 Python 代码示例来演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 大 O 符号表示法

O 符号表示法是一种用来描述算法时间复杂度的记号系统。它表示算法运行时间随输入规模增长的上界。在大 O 符号表示法中,我们通常关注算法的最坏情况下的运行时间。

a ) 大 O 符号的定义

O 符号表示法的定义如下:

  • O ( g ( n )):表示算法的时间复杂度为 g ( n )。
  • g ( n ):表示一个函数,表示算法的运行时间。
  • n :表示输入规模的大小。

在大 O 符号表示法中,常见的函数有以下几种:

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

b ) 示例代码

下面通过几个示例来演示大 O 符号表示法的应用:

示例 1 :线性搜索算法

def linear_search(arr, target):for i, num in enumerate(arr):if num == target:return ireturn -1# 示例使用
arr = [4, 2, 9, 7, 5, 1]
target = 7
index = linear_search(arr, target)
print("目标元素 {} 的索引是:{}".format(target, index))

代码解释:上述代码定义了一个 linear_search 函数,它接受一个列表 arr 和目标元素 target 作为输入。函数使用 for 循环逐个查找列表中的元素,如果找到目标元素,则返回其索引,否则返回- 1 。该算法的时间复杂度是 O ( n ),因为它需要遍历整个列表。

在这里插入图片描述

示例 2 :快速排序算法

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x <= pivot]right = [x for x in arr[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)# 示例使用
arr = [4, 2, 9, 7, 5, 1]
sorted_arr = quick_sort(arr)
print("排序后的列表:", sorted_arr)

代码解释:上述代码定义了一个 quick_sort 函数,它使用递归的方式实现快速排序算法。函数首先选择一个基准元素 pivot ,然后将列表分割为比基准元素小和大的两个子列表。最后,通过递归调用 quick_sort 函数对子列表进行排序,并将结果合并返回。该算法的时间复杂度是 O ( n log n ),因为每次递归调用都将问题的规模减半。

在这里插入图片描述

通过上述示例,我们可以看到不同算法的时间复杂度如何表示和分析。了解大 O 符号表示法可以帮助我们比较和评估不同算法的性能,选择合适的算法来解决问题。

2. 常见时间复杂度分析

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

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

常见时间复杂度的分析是通过观察算法中的循环、递归等结构来确定的。在分析时间复杂度时,通常关注循环的次数、递归的层数等。

总结

本篇博客介绍了大 O 符号表示法和常见时间复杂度的概念,并通过 Python 代码示例演示了它们的应用。大 O 符号表示法是描述算法时间复杂度的常见表示方法,它帮助我们比较和评估不同算法的性能。常见时间复杂度分析则通过观察算法的结构来确定算法的时间复杂度。

理解大 O 符号表示法和常见时间复杂度分析可以帮助我们选择合适的算法来解决问题,并评估算法的性能。通过深入学习和应用这些概念,你将能够设计和实现高效的算法,提高程序的性能和效率。

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

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

相关文章

动态规划01背包之416分割等和子集(第10道)

题目&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例&#xff1a; 解法&#xff1a; 先复习一下01背包问题&#xff1a; dp[i][j]的含义&#xff1a;从下标为[0-i]的物品里…

Linux->初识计算机网络

目录 前言&#xff1a; 1 网络发展背景 2 协议 2.1 网络协议初识 2.2 协议分层 2.3 OSI、TCP/IP层状模型 2.4 协议和操作系统的关系 2.5 根据协议栈的通信 3 网络中的地址管理 前言&#xff1a; 本篇当中没有任何关于网络编程的讲解&#xff0c;全部是对网络的宏观理解…

【数学建模】 灰色预测模型

数学建模——预测模型简介 https://www.cnblogs.com/somedayLi/p/9542835.html 灰色预测模型 https://blog.csdn.net/qq_39798423/article/details/89283000?ops_request_misc&request_id&biz_id102&utm_term%E7%81%B0%E8%89%B2%E9%A2%84%E6%B5%8B%E6%A8%…

MySQL 进阶之王,MySql 性能实战源码 + 笔记 + 项目实战

随着互联网时代的兴起&#xff0c;MySQL 在数据库领域日益显现出举足轻重的地位&#xff0c;它不断扩大的用户群体就是很好的证明。在这样的背景下&#xff0c;需要越来越多的人在知识资源方面为之付出&#xff0c;将自己对 MySQL 数据库的学习过程、运维经验、个人理解等记录下…

scripy其他

持久化 # 爬回来&#xff0c;解析完了&#xff0c;想存储&#xff0c;有两种方案 ## 方案一&#xff1a;一般不用 parse必须有return值&#xff0c;必须是列表套字典形式--->使用命令&#xff0c;可以保存到json格式中&#xff0c;csv中scrapy crawl cnblogs -o cnbogs.j…

Web3 开发指南:使用 NFTScan NFT API 构建一个 NFT 链上追踪器

对于大多数 Web3 团队来说&#xff0c;构建一个完整的链上 NFT 数据追踪系统是一项具有挑战性的任务&#xff0c;构建一个 NFT 链上追踪器更是如此。涉及到处理区块链上的智能合约和交易数据&#xff0c;并将其与外部数据源进行整合和分析工作量是十分巨大的&#xff1a; 区块链…

RocketMQ学习笔记(实操篇)

目录 基本操作 启动 测试 双主双从集群搭建 总体架构 工作流程 服务器环境 Host添加信息 防火墙配置 环境变量配置 创建消息存储路径 broker配置文件 修改启动脚本文件 服务启动 查看进程状态 查看日志 mqadmin管理工具 使用方式 命令介绍 集群监控平台搭…

基于深度学习的高精度刀具检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度刀具检测识别系统可用于日常生活中或野外来检测与定位刀具目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的刀具目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

谈谈——互联网生活中的隐私保护

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

图形编辑器开发:参考线吸附功能,让图形自动对齐

最近我给图形编辑器增加了参照线吸附功能&#xff0c;讲讲我的实现思路。 我正在开发的图形设计工具&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://blog.fstars.wang/app/suika/ 效果是被移动的图形会参考周围图形&#xff0c;自动与它们进行吸附…

MySQl数据库第八课-------SQL命令查询-------主要命脉

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 查询数据 条件 逻辑运算符 模糊查询 范围查询 in 判断空 UNION 排序 聚合 分组&#xff1a;group by —————————…

c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

效果可查看上一篇博文&#xff1a;js手动画平滑曲线&#xff0c;贝塞尔曲线拟合【代码】js手动画平滑曲线&#xff0c;贝塞尔曲线拟合。https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm1001.2014.3001.5502 代码如下&#xff1a; #include <cmath&…

FPGA实验三:状态机的设计

目录 一、实验目的 二、实验要求 三、实验代码 1.design source文件部分代码 2.测试文件代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 &#xff08;1&#xff09;设计好序列检测器 &#xff08;2&#xff09;仿真波形&#xff08;检测11010&#xff09; 3…

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配

linux - bc 命令安装

一.引言 迁移新机器后发现没有 bc 命令&#xff0c;之前 shell 脚本的一些计算逻辑会出错&#xff0c;下面快速安装一下。 二.安装 bc 请确保在 root 权限下执行该命令&#xff1a; sudo yum install bc 出现下述界面即安装成功&#xff1a; 三.测试 bc 测试下脚本里 % 的…

快速小巧的粘贴应用程序Hasty Paste

什么是 Hasty Paste? Hasty Paste 是一个快速粘贴文本并共享的地方&#xff0c;主要用于共享调试日志等&#xff0c;以帮助开发人员提供技术支持。该项目的目标是既快又小。 命令行安装 在群晖上以 Docker 方式安装。 官方的镜像没有发布在 docker hub&#xff0c;而是在 gh…

尚医通04:Axios Node Npm bable webpack+前端工程改造

目录 本日学习 内容介绍 Axios Node NPM包管理器 Babel 模块化 Webpack 搭建前端工程 前端框架介绍 前端开发过程介绍 登录改造成本地接口 本日学习 1. 了解Axios :他是异步请求用的&#xff0c;前后端。 用于在浏览器和 Node.js 中发送 HTTP 请求。它支持从服务器…

[桌面运维] 显示器 色准,色域,色深,分辨率,带宽,刷新率的基本概念,图像呈现的基本原理

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

华为数通智选交换机S5735S-L24T4S-QA2无法SSH远程访问

以前都是按照华为S5700交换机开启SSH远程访问方法配置不同网段通过静态路由实现互通,华为S5700交换机开启ssh远程登陆,现在新买的华为数通智选交换机S5735S-L24T4S-QA2,也是按照这步骤配置,令人不解的是,竟然无法ssh访问,仔细看了配置也没有发现问题,在华为eNSP模拟器上验…