【初探数据结构】时间复杂度和空间复杂度

ops/2025/2/26 3:28:40/

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感兴趣的朋友

文章目录

    • 时间复杂度
      • 时间复杂度的概念
      • 大O渐进表示法
      • 易错建议
    • 空间复杂度
    • 常见的复杂度对比
    • 总结

时间复杂度

时间复杂度的概念

算法执行时间随输入规模(N)增长的渐进趋势的数学函数,具体表现为算法基本操作的执行次数

由于一个算法所花费的时间与其中语句的执行次数成正比例,所以算法中的基本操作的执行次数,为算法的时间复杂度。

为什么不用时间呢?

  • 不同硬件设备运行速度差异大,实际时间不具备普适性。

即:

找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{int count = 0;for (int i = 0; i < N ; ++ i){for (int j = 0; j < N ; ++ j){++count;}}for (int k = 0; k < 2 * N ; ++ k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

Func1执行的基本操作次数:
F ( N ) = N 2 + 2 ∗ N + 10 F(N)=N^2+2*N+10 F(N)=N2+2N+10

那么,我们每次表示时间复杂度都要写像这样长长的表达式吗?

麻烦,而且我们没有必要去精确计算执行次数,只需要一个大概次数,所以我们使用大O渐进表示法。

大O渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

目标:忽略低阶项和常数系数,聚焦最高阶项的增长趋势。

推导步骤

  1. 用常数1替代所有加法常数(如 F(N)=1000O(1))。

  2. 只保留最高阶项(如 F(N)=N³ + N² + 1O(N³))。

  3. 去除最高阶项的系数(如 F(N)=3N²O(N²))。

使用大O的渐进表示法后,Func1的时间复杂度为:
O ( N 2 ) O(N^2) O(N2)

大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

此外,有一些算法的时间复杂的存在最好、最坏和平均的情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

看一个例子:在一个长度为N数组中搜索一个数据x

  • 最坏情况:N次且没有找到
  • 平均情况:N/2次找到
  • 最好情况:1次找到

一般时间复杂度取用算法的最坏运行情况

所以:数组中搜索数据的时间复杂度为O(N)

易错建议

  1. 很多初学者,找时间复杂度习惯用循环去计算,实则很容易出错。建议读者一定要去观察程序的执行逻辑。
    误区:循环层数越多,时间复杂度一定越高。
    反例
		for (int i = 0; i < N; i++) {       // O(N)for (int j = 0; j < 100; j++) { // 固定执行100次// 操作}}

总时间复杂度为 O(N),而非 O(N²)

  1. 时间复杂度代表的是一个量级。你可以尽你最大的想象力去想象他有多大,我的意思是,他是无法被轻易改变的。如: N − 9999999999999999999999 … … N-9999999999999999999999…… N9999999999999999999999……他的时间复杂度依然为: O ( N ) O(N) O(N)同样的: 9999999999999999999999 … … 9999999999999999999999…… 9999999999999999999999……他的时间复杂度依然为: O ( 1 ) O(1) O(1)

空间复杂度

空间复杂度也是一个数学表达式(函数),是对一个算法在运行过程中临时占用存储空间大小的量度(注意这个临时) 。也使用大O渐进表示法

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

你知道为什么要有这个”临时“吗?

因为空间是可以重复利用的,算法中开辟过的空间重复使用空间复杂度不会增加。
而时间是一去不复返的,无法重复使用。

看一个例题你就明白了

// 计算Fib的空间复杂度?
// 返回斐波那契数列的前n项
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

这里的时间复杂度不难推导:O(2^N)

那么空间复杂度呢?
也是O(2^N)吗?
没错,这里重复利用了空间,实际上空间复杂度为:
O ( N ) O(N) O(N)

  • 误区:递归算法的空间复杂度一定很高。
    反例:递归遍历链表的空间复杂度为 O(N)(递归栈深度),而迭代法为 O(1)

常见的复杂度对比

在这里插入图片描述
在这里插入图片描述

总结

  • 时间复杂度关注算法执行次数的增长趋势,空间复杂度关注额外空间的占用。

  • 大O渐近表示法通过简化表达式,聚焦主要矛盾。

  • 实际应用中需结合具体场景选择最优算法


http://www.ppmy.cn/ops/161338.html

相关文章

Redis--模糊查询--方法实例

原文网址&#xff1a;Redis–模糊查询–方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Redis模糊查询的方法。 官网网址 https://redis.io/commands/keys/ https://redis.io/commands/scan/ Redis模糊查询键的方法 Redis提供了两种模糊查询键的方法&#xff…

MySQL数据库连接池泄露导致MySQL Server超时关闭连接

前言 最近做项目&#xff0c;发现老项目出现xxx&#xff0c;这个错误其实很简单&#xff0c;出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理&#xff0c;因为是druid数据库&#xff0c;且在github也出现这样的issue&#xff1a;The last packet successf…

14.8 Auto-GPT 自主智能体设计解密:构建具备长期记忆的智能决策系统

Auto-GPT 自主智能体设计解密:构建具备长期记忆的智能决策系统 关键词:Auto-GPT 架构设计、自主智能体开发、LangChain Agents、长期记忆系统、工具链编排 1. 自主智能体的核心架构设计 Auto-GPT 系统架构图解: #mermaid-svg-NuDU1eo6sXqhA6Ve {font-family:"trebuch…

推送项目 之 解决冲突

文章目录 为什么会发生冲突&#xff1f;如何解决这些冲突&#xff1f;1. **查看冲突文件**2. **解决二进制文件冲突**3. **解决文本文件冲突**4. **标记冲突已解决**5. **完成合并**6. **推送更改** 注意事项总结 问题&#xff1a;我们在git pusll拉取远程仓库的代码到本地对比…

Nginx代理ElasticSearch

1、将ES的账号:密码通过Base64加密 假设账号密码如下&#xff1a; 账号&#xff1a;elastic密码&#xff1a;elastichuayunworld.com echo -n elastic:elastichuayunworld.com | base64 ZWxhc3RpYzplbGFzdGljQGh1YXl1bndvcmxkLmNvbQ2、在 Nginx 配置中传递认证信息 locatio…

【量化科普】Sharpe Ratio,夏普比率

【量化科普】Sharpe Ratio&#xff0c;夏普比率 &#x1f680;&#x1f680;&#x1f680;量化软件开通&#x1f680;&#x1f680;&#x1f680; &#x1f680;&#x1f680;&#x1f680;量化实战教程&#x1f680;&#x1f680;&#x1f680; 在量化投资领域&#xff0c;…

前端面试场景题 1 (批量处理toast、减少if-else)

一、请求失败会弹出 一个toast , 如何保证批量请求失败 , 只弹出一个toast 方法一&#xff1a;使用全局标志位 JavaScript let isToastShown false; // 全局标志位function makeRequests() {const requests [fetchPost(),fetchComments()]; // 多个请求Promise.all(reque…

量子比特的实现与优化技术:解密量子计算的核心

量子比特的实现与优化技术:解密量子计算的核心 大家好,我是Echo_Wish,今天我们来聊聊量子计算中的一个核心概念——量子比特(qubit)的实现与优化技术。量子比特作为量子计算的基本单位,与经典计算中的比特有着本质的不同。本文将深入探讨量子比特的实现方法及其优化技术…