当前位置: 首页 > news >正文

python数据结构与算法(基础)

先补充一些基础概念,下一篇再讲数据结构和算法


数据结构与算法

一、基础概念

1.1 数据结构(Data Structure)

定义
数据结构是数据元素之间的逻辑关系以及在计算机中的存储表示方式,是组织、管理和高效访问数据的方式。

核心三要素

  • 逻辑结构:数据元素之间的抽象关系(如线性、树形、图状、集合)
  • 存储结构:数据在计算机中的物理存储方式(如顺序、链式、索引、散列)
  • 运算集合:可在数据结构上执行的操作(如插入、删除、查找、遍历)

一句话总结:数据结构 = 逻辑结构 + 存储结构 + 操作集合

常见数据类型分类

类型示例
基本类型整数、浮点数、布尔值、字符
复合类型列表、元组、集合、字典
抽象数据类型(ADT)栈、队列、树、图等

1.2 算法(Algorithm)

定义
算法是解决特定问题的一组明确、有限的步骤序列,是对解决问题方法的精确描述。

核心关系

程序 = 数据结构 + 算法
这是著名计算机科学家 Niklaus Wirth 提出的经典公式,强调了程序设计的两大基石。

影响效率的关键因素

  • 相同数据 + 不同算法 → 执行效率差异显著
  • 相同问题 + 不同数据结构 → 可能导致算法选择不同
  • 合理搭配数据结构与算法 → 显著提升程序性能

二、算法特性与独立性

2.1 算法的独立性

算法是一种独立于编程语言和具体实现的思维模式。其本质是“解决问题的策略”,而非代码本身。

示例说明
以“穷举法”为例:

  • 思想:枚举所有可能解并验证是否满足条件
  • 实现:可用 C、Python、Java 等任意语言实现
  • 结论:算法思想具有普适性,语言只是表达工具

启示:学习算法重在理解其设计思想,而非死记代码。


2.2 算法的五大基本特性

特性说明示例/反例
输入性有零个或多个输入如排序算法需输入数组
输出性至少有一个输出必须返回结果或状态
有穷性在有限步骤内结束死循环违反此特性
确定性每步操作无歧义相同输入始终得相同输出
可行性每一步都可执行且在合理时间内完成“瞬间传送”不可行

注意:违反任一特性,则不能称为有效算法。


三、时间复杂度深度解析

3.1 时间效率的本质

执行时间模型

总执行时间 T(n) = Σ(每步操作耗时 × 执行次数)

分析原则

  • 假设每条基本操作(如赋值、比较、算术运算)耗时为常量
  • 关注操作次数随输入规模 n 的增长趋势,而非绝对运行时间
  • 忽略硬件、语言等外部因素干扰

3.2 时间复杂度概念

定义
时间复杂度描述算法执行时间随输入规模 n 增长的渐进行为,反映算法的“量级”或“阶”。

经典示例
求解满足 a + b + c = 1000 且 a^2 + b^2 = c^2 的整数解(a,b,c ≥ 0)

若采用三重嵌套循环遍历:

for a in range(1001):for b in range(1001):for c in range(1001):if a + b + c == 1000 and a*a + b*b == c*c:print(a, b, c)
  • 操作次数 ≈ 1001^3
  • 设 n = 1000 ,则 T(n) \approx n^3
  • 时间复杂度为 O(n^3)

3.3 大O表示法(Big-O Notation)

定义
大O表示法用于描述函数增长的上界,即最坏情况下的增长速率。

数学定义
若存在正常数a和b,使得当n>=b时,有T(n)<=a*f(n),则称T(n)= O(f(n))。
简化规则

  1. 忽略常数项(如 O(3n^2) \rightarrow O(n^2) )
  2. 忽略低阶项(如 O(n^2 + n) \rightarrow O(n^2) )
  3. 保留最高次项

3.4 时间复杂度计算规则

结构类型计算方法示例
基本操作O(1)赋值、访问数组元素
顺序结构各部分相加,取最大值O(n) + O(1) = O(n)
循环结构循环次数 × 单次循环复杂度for i in range(n): 内部 O(1) → O(n)
嵌套循环各层复杂度相乘两层 n 次循环 → O(n²)
分支结构取各分支中最复杂者if A: O(n); else: O(1) → O(n)
递归调用使用递推公式或主定理分析归并排序: T(n) = 2T(n/2) + O(n) → O(n log n)

3.5 最优、最坏与平均时间复杂度

类型定义特点实际意义
最优时间复杂度最理想情况下执行时间过于乐观,参考价值低一般不作为评估依据
最坏时间复杂度最恶劣情况下执行时间提供性能保障重点评估指标
平均时间复杂度所有可能输入下的期望时间更全面但难计算常用于概率分析

实践建议:优先关注最坏时间复杂度,确保系统在极端情况下的稳定性。


四、常见时间复杂度对比

渐进增长率排序(由优到劣)

时间复杂度名称增长速度典型算法示例
O(1)常数阶恒定数组随机访问、哈希表查找
O(\log n)对数阶极慢二分查找、平衡二叉树操作
O(\sqrt{n})平方根阶较慢素数判断(试除法)
O(n)线性阶线性增长线性搜索、数组遍历
O(n \log n)线性对数阶略快于线性快速排序、归并排序、堆排序
O(n^2)平方阶明显变慢冒泡排序、选择排序、简单动态规划
O(n^3)立方阶大数据不可行Floyd算法、三重循环
O(2^n)指数阶急剧爆炸子集枚举、暴力破解
O(n!)阶乘阶极端缓慢旅行商问题(暴力法)

趋势图示意

执行时间 ↑||                       O(n!)|                    O(2ⁿ)|                 O(n³)|              O(n²)|          O(n log n)|       O(n)|    O(√n)|  O(log n)|O(1)+----------------------------------→ 数据规模 n

观察结论:当 n > 1000 时,O(n^2) 以上算法往往难以接受; O(n \log n) 是大规模数据处理的“分水岭”。


五、空间复杂度分析

5.1 核心概念

定义
空间复杂度指算法在运行过程中临时占用的存储空间大小,通常也用大O表示法描述。

关键点

  • 不包括输入数据本身所占空间
  • 主要考虑辅助变量、递归调用栈、临时数据结构等
  • 与时间复杂度类似,关注增长趋势

5.2 常见空间复杂度

空间复杂度描述典型场景
O(1)常量空间原地排序(如冒泡排序)、简单变量计算
O(\log n)对数空间递归深度为 \log n (如快速排序平均情况)
O(n)线性空间复制数组、哈希表、BFS队列
O(n \log n)线性对数空间某些分治算法的中间结构
O(n^2)平方空间邻接矩阵存储图、DP二维表

5.3 时间与空间的权衡(Trade-off)

策略说明示例
以空间换时间增加内存使用,减少计算时间哈希表加速查找、动态规划缓存结果
以时间换空间减少内存占用,增加计算时间不使用缓存的递归、流式处理大数据

💡 设计原则:根据应用场景权衡。实时系统重时间,嵌入式系统重空间。


六、实际应用建议

场景推荐策略
小规模数据(n < 100)优先选择实现简单的算法(如冒泡排序),即使复杂度为 O(n^2)
中等规模数据(n ~ 10⁴)选择 O(n^2) 以下算法,避免嵌套循环
大规模数据(n > 10⁵)必须使用 O(n \log n) 或更优算法(如快排、堆排)
内存受限环境优先考虑空间复杂度,避免递归过深或大数组
实时系统(如高频交易)严格控制最坏时间复杂度,避免不可预测延迟
频繁查询场景考虑预处理+索引(如哈希、树结构)提升查询效率

关键结论
没有“最好”的算法,只有“最合适”的算法
实际开发中应结合:数据规模、性能要求、资源限制、实现成本 综合决策。


七、附录:常见操作复杂度速查表

操作数组链表哈希表二叉搜索树(平衡)
查找O(n) / O(1)*O(n)O(1) 平均O(log n)
插入(头)O(n)O(1)--
插入(任意)O(n)O(n)O(1)O(log n)
删除O(n)O(n)O(1)O(log n)
遍历O(n)O(n)O(n)O(n)

注:数组按索引访问为 O(1),按值查找为 O(n)

http://www.lryc.cn/news/612982.html

相关文章:

  • DrissionPage自动化:高效Web操作新选择
  • 怎么在本地引入字体
  • 深入解析嵌套事务:原理与应用
  • 基于langchain的两个实际应用:[MCP多服务器聊天系统]和[解析PDF文档的RAG问答]
  • HTTP 协议升级(HTTP Upgrade)机制
  • 自动驾驶控制算法——滑模控制(SMC)原理与建模
  • TCP 如何保证可靠性
  • FluentUI-main的详解
  • 多账号管理方案:解析一款免Root的App分身工具
  • B-树与B+树
  • 动力电池点焊机:效率质量双提升,驱动新能源制造升级
  • Dify 从入门到精通(第 20/100 篇):Dify 的自动化测试与 CI/CD
  • Oracle exp imp expdp impdp 命令详解
  • PCB制造中压接孔、插接孔、沉头孔、台阶孔的区别及生产流程
  • 《C语言》函数练习题--1
  • 基于大数据的美食视频播放数据可视化系统 Python+Django+Vue.js
  • Vscode Data Wrangler 数据查看和处理工具
  • GitHub 上 Star 数量前 20 的开源 AI 项目
  • 中国MCP市场:腾讯、阿里、百度的本土化实践
  • 医疗人效管理新标杆:盖雅工场如何赋能健康服务企业提质增效
  • Java 大视界 -- Java 大数据在智能教育在线课程互动优化与学习体验提升中的应用(386)
  • 一篇文章用大白话带初学者搞清训练集、测试集及验证集关系及场景逻辑(包清楚)
  • LLMs api价格对比平台
  • --- Eureka 服务注册发现 ---
  • 【第7话:相机模型3】自动驾驶IPM图像投影拼接技术详解及代码示例
  • TikTok Shop冷启动破局战:亚矩阵云手机打造爆款账号矩阵
  • AWS RDS自定义终端节点深度分析工具:Python脚本详解
  • 手机控制断路器:智能家居安全用电的新篇章
  • STM32HAL 快速入门(一):点灯前的准备 —— 从软件安装到硬件原理
  • 云手机存在的意义是什么?