初识数据结构——算法效率的“两面性”:时间与空间复杂度全解析

news2025/4/17 12:18:06

📊 算法效率的“两面性”:时间与空间复杂度全解析

1️⃣ 如何衡量算法好坏?

举个栗子🌰:斐波那契数列的递归实现

public static long Fib(int N) {
    if(N < 3) return 1;
    return Fib(N-1) + Fib(N-2);
}

问题:这个算法像“树懒”一样慢!为什么?
答案:因为它重复计算了大量子问题,时间复杂度高达O(2^N)!

直观感受:为什么递归这么慢?
试算Fib(5)的执行过程

Fib(5)
├── Fib(4)
│   ├── Fib(3)
│   │   ├── Fib(2)
│   │   └── Fib(1)
│   └── Fib(2)
└── Fib(3)
    ├── Fib(2)
    └── Fib(1)
惊人发现:

Fib(3)被计算了2次

Fib(2)被计算了3次

当N=20时,Fib(1)会被计算6765次!

2️⃣ 时间复杂度:算法的“速度表”⏱️

📌 核心思想

  • 基本操作次数决定算法速度
  • 大O表示法:抓主要矛盾(最高阶项)

🧮 大O三定律

  1. 常数变1F(N)=2N+10O(N)
  2. 只留最高阶O(N² + N)O(N²)
  3. 去除系数O(2N)O(N)

🌟 经典例题分析

代码示例执行次数时间复杂度类比
双重循环N² + 2N +10O(N²)全班同学两两握手🤝
单循环+固定循环2N + 10O(N)点名签到📝
二分查找log₂NO(logN)对折纸找名字📜
斐波那契递归2^NO(2^N)细胞分裂爆炸增长💥

3️⃣ 空间复杂度:算法的“储物柜”🗄️

📌 核心思想

  • 临时变量数量决定内存占用
  • 递归深度=空间复杂度

🧮 冒泡排序的空间复杂度分析:为什么是O(1)?

## 🔍 冒泡排序
```java
void bubbleSort(int[] array) {
    for (int end = array.length; end > 0; end--) {
        boolean sorted = true;                  // 变量1
        for (int i = 1; i < end; i++) {
            if (array[i - 1] > array[i]) {
                Swap(array, i - 1, i);         // 临时变量在Swap内
                sorted = false;                // 修改变量1
            }
        }
        if (sorted == true) break;
    }
}

🧳 实例对比

变量名类型数量生命周期是否随输入规模变化
endint1外层循环❌ 固定4字节
sortedboolean1每次外层循环❌ 固定1字节
iint1内层循环❌ 固定4字节
Swap临时变量 int1交换瞬间❌ 固定4字节

💡 关键结论

  1. 固定数量变量:无论输入数组多大(N=100或N=1,000,000),都只使用:

    - 3个基本类型变量(end/sorted/i)
    
    - 1个交换用的临时变量
    
  2. 不依赖输入规模:变量数量与数组长度array.length完全无关

  3. 原地排序算法:直接在原数组上操作,不需要额外存储空间

🆚 对比其他排序算法

算法类型空间复杂度内存使用特点
冒泡排序O(1)只用固定几个变量🔘
斐波那契数组O(N)需要N长度的数组📊
阶乘递归O(N)递归调用N层栈帧📚

4️⃣复杂度权衡的艺术

  • 时间换空间:比如用哈希表加速查询
  • 空间换时间:比如动态规划存储中间结果

💡 现代编程箴言
在内存充足的今天,我们更关注时间复杂度优化,
但处理海量数据时,空间复杂度依然关键!


📚 课后小测验

  1. 下列哪个时间复杂度最快?
    A. O(N!)
    B. O(N²)
    C. O(log(N))
    D. O(2^N)

  2. 递归计算阶乘时,空间复杂度为什么是O(N)?

(答案:C 因为要保存N层递归调用栈)


🎯 总结

复杂度分析就像给算法做“体检”:

  • 时间复杂度=心肺功能(跑得快不快)
  • 空间复杂度=胃容量(吃得多不多)

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

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

相关文章

【USRP】srsRAN 开源 4G 软件无线电套件

srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括&#xff1a; srsUE - 具有原型 5G 功能的全栈 SDR 4G UE 应用程序srsENB - 全栈 SDR 4G eNodeB 应用程序srsEPC——具有 MME、HSS 和 S/P-GW 的轻量级 4G 核心网络实现 安装系统 Ubuntu 20.04 USRP B210 sudo …

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…

简单线程池实现

线程池的概念 线程池内部可以预先去进行创建出一批线程&#xff0c;对于每一个线程&#xff0c;它都会周期性的进行我们的任务处理。 线程内部在维护一个任务队列&#xff0c;其中我们外部可以向任务队列里放任务&#xff0c;然后内部的线程从任务队列里取任务&#xff0c;如…

CentOS7 安装 LLaMA-Factory

虚拟机尽量搞大 硬盘我配置了80G&#xff0c;内存20G 下载源码 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git 如果下载不了&#xff0c;可以进入github手动下载&#xff0c;然后在传入服务器。 也可以去码云搜索后下载 安装conda CentOS7安装conda…

最新扣子(Coze)案例教程:最新抖音视频文案提取方法替代方案,音频视频提取文案插件制作,手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb; 星球群同学反馈&#xff0c;扣子平台的视频提取插件已下架&#xff0c;很多智能体及工作流不能使用&#xff0c;斜杠君这里研究了一个替代方案分享给大家。 方案原理&#xff1a;无论是任何视频或音频转文案&#xff0c;我们提取的方式首先都是要…

adb检测不到原来的设备List of devices attached解决办法

进设备管理器-通用串行总线设备 卸载无法检测到的设备驱动 重新拔插数据线

案例分享(七):实现Apache-sharding-proxy的监控

案例分享(七):实现Apache-sharding-proxy的监控 背景部署流程背景 因业务需求,实现Apache-sharding-proxy的监控(基于Apache-sharding-agent)。 部署流程 1.下载agent的包,选择与sharding版本一致,要不然无法启动sharding 2.点击5.3.0之后可以看到有sharding,proxy…

docker 安装 awvs15

安装好 docker bash <(curl -sLk https://www.fahai.org/aDisk/Awvs/check.sh) xrsec/awvs:v15等待完成后访问即可 地址: https://server_ip:3443/#/login UserName: awvsawvs.lan PassWord: Awvsawvs.lan修改密码 docker ps -a //查看容器&#xff0c;找到相应id d…

Flutter:Flutter SDK版本控制,fvm安装使用

1、首先已经安装了Dart&#xff0c;cmd中执行 dart pub global activate fvm2、windows配置系统环境变量 fvm --version3、查看本地已安装的 Flutter 版本 fvm releases4、验证当前使用的 Flutter 版本&#xff1a; fvm flutter --version5、切换到特定版本的 Flutter fvm use …

碰一碰发视频源头开发技术服务商

碰一碰发视频系统 随着短视频平台的兴起&#xff0c;用户的创作与分享需求日益增长。而如何让视频分享更加便捷、有趣&#xff0c;则成为各大平台优化的重点方向之一。抖音作为国内领先的短视频平台&#xff0c;在2023年推出了“碰一碰”功能&#xff0c;通过近距离通信技术实…

Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作

文章目录 Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作VECTOR 数据类型基本语法Vector 维度限制和向量大小向量存储格式&#xff08;DENSE vs SPARSE&#xff09;1. DENSE存储2. SPARSE存储3. 内部存储与空间计算 Oracle VECTOR数据类型的声明格式VECTOR基本操…

C++day8

思维导图 牛客练习 练习 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory> using namespace std; class user{ public: …

MySQL的进阶语法8(SQL优化——insert、主键、order by、group by、limit、count和update)

目录 一、插入数据 1.1 insert 1.2 大批量插入数据 二、主键优化 2.1 数据组织方式 2.2 页分裂 2.2.1 主键顺序插入效果 2.2.2 主键乱序插入效果 2.3 页合并 2.4 索引设计原则 三、order by优化 3.1 执行以下两条语句&#xff08;无索引&#xff09; 3.2 创建索引…

自然语言处理利器NLTK:从入门到核心功能解析

文章目录 一、NLP领域的基石工具包二、NLTK核心模块全景解析1 数据获取与预处理2 语言特征发现3 语义与推理 三、设计哲学与架构优势1 四维设计原则2 性能优化策略 四、典型应用场景1 学术研究2 工业实践 五、生态系统与未来演进 一、NLP领域的基石工具包 自然语言工具包&…

使用Docker安装及使用最新版本的Jenkins

1. 拉取镜像 通过Windows powerShell执行命令行&#xff08;2选1&#xff09;&#xff1a; -- 长期支持版 docker pull jenkins/jenkins:lts-- 最新版 docker pull jenkins/jenkins:latest 2. 创建并执行容器 你可以通过以下命令来运行Jenkins容器&#xff0c;执行命令&…

15-产品经理-维护需求

一、提研发需求 在产品–研发需求列表页&#xff0c;点击“提研发需求”按钮&#xff0c; 在提研发需求页面&#xff0c;可以选择已有的计划。也可以在计划页面里进行关联。 未编辑完的需求可以点击【存为草稿】按钮&#xff0c;保存为草稿状态&#xff0c;待编辑完成再选择提…

js前端对时间进行格式处理

时间格式处理 通过js前端&#xff0c;使用dayjs库进行格式化 安装dayjs库 npm install dayjs 封装成日期格式化工具类 formatter.ts // 导入 dayjs&#xff0c;先安装依赖 npm install dayjs import dayjs from "dayjs"; import utc from "dayjs/plugin/utc…

如何拿到iframe中嵌入的游戏数据

在 iframe 中嵌入的游戏数据是否能被获取&#xff0c;取决于以下几个关键因素&#xff1a; 1. 同源策略 浏览器的同源策略是核心限制。如果父页面和 iframe 中的内容同源&#xff08;即协议、域名和端口号完全相同&#xff09;&#xff0c;那么可以直接通过 JavaScript 访问 …

Chrome 135 版本新特性

Chrome 135 版本新特性 一、Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动态网站&#xff0c;同时也将 OpenID Connect (OIDC) 的隐式流程迁移到授权码流程。这样做的目的是进一步提升第…

【Vue-组件】学习笔记

目录 <<回到导览组件1.项目1.1.Vue Cli1.2.项目目录1.3.运行流程1.4.组件的组成1.5.注意事项 2.组件2.1.组件注册2.2.scoped样式冲突2.3.data是一个函数2.4.props详解2.5.data和prop的区别 3.组件通信3.1.父子通信3.1.1.父传子&#xff08;props&#xff09;3.1.2.子传父…