数据结构:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)

news2025/6/3 22:15:24

目录

什么是时间复杂度?

如何表示时间复杂度?

为什么需要时间复杂度? 

用几个例子理解

怎么分析代码的时间复杂度?

什么是空间复杂度?

举例理解


什么是时间复杂度?

时间复杂度是用来衡量一个算法“运行时间随输入规模增长的速度”的指标。

我们关心的是:
➡ 当输入规模 n 越来越大时,程序运行时间变快还是变慢?变慢得有多快?

但注意:
我们不是计算具体运行时间(秒),而是研究增长趋势(数量级)!

比如:

  • 输入 10 个元素花 1ms,100 个元素花 100ms:说明时间增长很快。

  • 输入 10 个元素花 1ms,100 个元素花 2ms:说明增长很慢,很高效。

如何表示时间复杂度?

我们通常用大 O 表示法(Big-O Notation)来表示时间复杂度,比如:

  • O(1) 常数级

  • O(log⁡n)对数级

  • O(n)线性级

  • O(nlog⁡n) 线性对数级

  • O(n^2)平方级

  • O(2^n)、O(n!)指数、阶乘级(非常慢)

这些从快到慢大致排序为:

O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!)

为什么需要时间复杂度? 

能预测程序是否能处理大数据。 

  • 比如O(n^2)的程序在 n = 10^5时已经跑不动了;

  • 而 O(nlog⁡n) 在 n = 10^6 时依然很快。

 能比较不同算法的效率。

选择排序是 O(n^2),归并排序是 O(nlog⁡n),在大数据面前差别巨大。

用几个例子理解

1. O(1):常数级

int a = 5;
int b = a + 3;

 不管你输入多大,只执行几条语句,时间不随输入增长

2. O(n):线性级

for (int i = 0; i < n; i++) {
    cout << i;
}

 循环执行 n 次,输入增加一倍,运行时间也大致增加一倍

3. O(n²):平方级 

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        cout << i << j;
    }
}

嵌套循环,每层都跑 n 次,总运行次数为 n×n = n^2

4. O(log n):对数级(如二分查找) 

int binarySearch(vector<int>& nums, int target) {
    int l = 0, r = nums.size() - 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (nums[mid] == target) return mid;
        else if (nums[mid] < target) l = mid + 1;
        else r = mid - 1;
    }
    return -1;
}

 每次把搜索区间减半,只需要约 log⁡2n 次判断。

怎么分析代码的时间复杂度?

你可以遵循以下步骤:

  1. 看循环嵌套层数

    一层是 O(n),两层是 O(n^2),三层是 O(n^3)

  2. 注意递归的调用树

    如归并排序是 T(n)=2T(n/2)+O(n) → O(nlog⁡n)

  3. 看是否有减半、指数增长、全排列等模式

 

 


什么是空间复杂度?

空间复杂度(Space Complexity)是衡量一个算法在运行过程中临时占用多少内存空间的指标。

它回答的问题是:

如果输入规模是 n,算法为了运行,需要开辟多大的“额外空间”?

⚠️ 注意:

  • 不包括输入本身所占的空间,我们关心的是额外的空间使用。

  • 就像时间复杂度关注“运算量增长”,空间复杂度关注“内存占用增长”。

举例理解

1. O(1):常数空间(最优)

int sum = 0;
for (int i = 0; i < n; i++) {
    sum += arr[i];
}

这里只是用了一些变量(sum, i),无论 n 多大,占用空间都是常数级。

2. O(n):线性空间 

vector<int> res(n);
for (int i = 0; i < n; i++) {
    res[i] = arr[i] * 2;
}

 开了一个和输入一样大的数组 res,所以空间复杂度是 O(n)。

3. O(n²):二维数组 

int matrix[n][n];

 每个维度都是 n,所以总共是n×n=n2 个元素,空间复杂度是 O(n²)。

4. 递归调用带来的空间 

int factorial(int n) {
    if (n == 1) return 1;
    return n * factorial(n - 1);
}

 每次递归调用都要占用一次调用栈帧,调用 n 层,就要O(n) 空间。

有些递归算法虽然时间复杂度是 O(n),但如果用了“尾递归”或“迭代替代递归”,可以把空间优化到 O(1)。 

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

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

相关文章

SSL/TLS 协议详解:安全通信的基石

一、概述 SSL&#xff08;Secure Sockets Layer&#xff09; 及其继任者 TLS&#xff08;Transport Layer Security&#xff09; 是位于 传输层&#xff08;TCP&#xff09;与应用层之间 的加密协议&#xff0c;用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…

设计模式——外观设计模式(结构型)

摘要 本文介绍了外观设计模式&#xff0c;它是一种结构型设计模式&#xff0c;通过引入一个外观类来封装复杂子系统的调用细节&#xff0c;对外提供简单统一的接口。文中通过生活类比、关键角色介绍、使用场景分析以及结构说明等方面对这一模式进行了全面阐述&#xff0c;还涉…

Linux `vi/vim` 编辑器深度解析与高阶应用指南

Linux `vi/vim` 编辑器深度解析与高阶应用指南 一、核心功能解析1. 模式系统2. 与主流编辑器对比二、核心操作体系1. 高效导航命令2. 文本操作矩阵三、高阶配置体系1. .vimrc 配置示例2. 插件管理系统四、企业级开发实践1. 代码编辑技巧2. 宏录制与批量处理五、可视化与多窗口1…

ES中must与filter的区别

在 Elasticsearch 的布尔查询&#xff08;bool query&#xff09;中&#xff0c;must 和 filter 是两个核心子句&#xff0c;它们的核心区别在于 是否影响相关性评分&#xff0c;这直接决定了它们在查询性能、使用场景和结果排序上的差异。以下是详细对比&#xff1a; 一、核心…

qt之开发大恒usb3.0相机三

上一篇大恒相机的开发 是基于Qt Creator msvc工具链编译的&#xff0c;大恒相机msvc使用的的lib库是c版的。如果想要使用mingw工具链开发大恒相机&#xff0c;那么找连接对相应的lib库。mingw对应的库是c的。 配置如下&#xff1a; 图像获取核心代码如下 void __stdcall Wid…

Transformer架构详解:从Attention到ChatGPT

Transformer架构详解&#xff1a;从Attention到ChatGPT 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Transformer架构详解&#xff1a;从Attention到ChatGPT摘要引言一、Attention机制&#xff1a;Transformer的…

数据中台(大数据平台)之数据安全管理

数据安全管理是结合大数据技术和行业特性&#xff0c;数据中台产品应具备数据分类分级、敏感数据智能识别的功能&#xff0c;并结合敏感数据管理、数据脱敏、数据加密等安全管控方式&#xff0c;保障数据安全可用。 1.安全分级分类&#xff1a;数据分级分类是一种将不同数据按…

github双重验证密码忘记或者获取不了了怎么办

背景 近期由于换了新手机&#xff0c;之前配置好的Authenticator这个App无法使用&#xff0c;导致获取不到二次验证的Authenticator code&#xff0c;登陆不上GitHub&#xff0c;不知道有没有人和我遇到同样的问题&#xff1f; 当我们配置2FA双重验证后&#xff0c;每次登陆gi…

告别复杂操作!电脑极简风格计时使用

无论是工作、学习还是日常生活&#xff0c;这款小巧实用的计时工具都能成为你掌控时间的好帮手。特别适合需要频繁切换正计时、倒计时和查看当前时间的场景。界面简洁&#xff0c;操作便捷&#xff0c;助你高效管理每一刻。 这是一款免安装的工具&#xff0c;下载后可直接打开…

[STM32问题解决(2)]STM32通过串口与PC通信,打开串口助手后无法在打开状态下下载程序和复位STM32

问题回顾 最近学习STM32单片机&#xff0c;经常使用STM32通过USART1串口与PC的串口助手进行通信。为了简单便捷&#xff0c;通常在打开串口的状态下下载程序。这样子下载程序后&#xff0c;STM32发出的信号&#xff0c;PC马上可以收到。 但是&#xff0c;突然出现了一个问题&a…

OpenHarmony定制系统组合按键(一)

一、开发环境 系统版本&#xff1a;OpenHarmony 4.0.10.13 设备平台&#xff1a;rk3568 SDK版本&#xff1a;fullSDK 4.0.10.13 DevEco Studio版本&#xff1a;4.1.0.400 二、需求背景 定制OpenHarmony 系统组合按键功能&#xff0c;例如仿Android Power VOL_Up组合键实现截…

Spring Boot 3 整合 MQ 构建聊天消息存储系统

引子 在构建实时聊天服务时&#xff0c;我们既要保证消息的即时传递&#xff0c;又需要对消息进行持久化存储以便查询历史记录。然而&#xff0c;直接同步写入数据库在高并发场景下容易成为性能瓶颈&#xff0c;影响消息的实时性。秉承"没有什么问题是加一层解决不了的&q…

非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术

随着人工智能的快速发展&#xff0c;尤其是在深度学习和强化学习领域&#xff0c;声学计算和人机交互进入前所未有的扩展和创新阶段。尽管传统声学方法取得了显著成功&#xff0c;但这些线性或准线性方法在实际环境中往往存在关键的不足&#xff0c;尤其在动态、复杂或混响环境…

C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件

文章目录 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、闭源、开源 四、STL的六大组件 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索&#xff1b; 一、什么是STL STL(standard template libaray 标准模板库)&#…

Flutter - 原生交互 - 相机Camera - 01

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 集成 Flutter提供了camera插件来拍照和录视频&#xff0c;它提供了一系列可用的相机&#xff0c;并使用特定的相机展示相机预览、拍照、录视频。 添加依赖 camera: 提供使用设备相机模块的工具path_provider: 寻找存储图…

湖北理元理律师事务所:个人债务管理的温度与精度

湖北理元理律师事务所&#xff1a;个人债务管理的温度与精度 面对信用卡、网贷、医疗债等多重债务压力&#xff0c;普通人常陷入“拆东墙补西墙”的恶性循环。湖北理元理律师事务所通过计划集团公司服务平台&#xff0c;推出“有温度的债务优化计划”&#xff0c;其人性化设计…

Compose原理 - 整体架构与主流程

一、整体架构 在官方文档中&#xff08;Jetpack Compose 架构层 | Android Developers&#xff09;&#xff0c;对Compose的分层有所阐述&#xff1a; 其中 Runtime&#xff1a;提供Compose的基础运行能力&#xff0c;包括State、Side-effects、CompositionLocal、Compositio…

CppCon 2014 学习: C++ Test-driven Development

“Elephant in the Room”这个比喻常用来形容那些大家都知道但没人愿意讨论的重大问题。 这段内容讲的是软件质量管理的经典做法和潜在的问题&#xff1a; 经典做法&#xff1a;开发完成后才进行人工测试&#xff08;manual testing after creation&#xff09;。隐喻“Cape o…

RAGflow详解及实战指南

目录 前言 一、RAGflow核心技术解析 1. 技术原理&#xff1a;检索与生成的协同进化 2. 架构设计&#xff1a;分层模块化与高扩展性 3. 核心优势&#xff1a;精准、高效、安全 二、RAGflow实战应用场景 1. 企业知识库搭建 2. 智能客服系统 3. 投资分析报告生成 4. 制造…

[Godot] 如何导出安卓 APK 并在手机上调试

在之前的文章中&#xff0c;我们已经详细介绍了如何配置 Godot 的安卓应用开发环境&#xff0c;包括安装 Android SDK、配置 Java 环境、设置 Godot 的 Android 导出模板等。本篇文章将进一步讲解如何将 Godot 项目导出为安卓 APK 文件&#xff0c;并实现在手机上进行调试运行。…