时间和空间复杂程度计算规则

时间复杂度和空间复杂度的计算是算法分析的重要部分。以下是详细的计算方法、示例,以及需要注意的要点。


1. 时间复杂度

时间复杂度描述算法执行所需时间随输入规模增长的增长关系,通常用 O O O 表示法 来表示,关注输入规模 n n n 的增长率。


1.1 时间复杂度的计算方法

  1. 找到最内层操作

    • 确定算法中执行次数最多的基本操作(如赋值、比较、加法等)。
  2. 统计执行次数

    • 从外到内,计算循环、递归或逻辑分支中基本操作的执行次数。
  3. 保留最高阶

    • 只保留执行次数随输入规模 n n n 增长最快的部分,忽略低次项和常数系数。

1.2 常见时间复杂度

  1. 常数时间: O ( 1 ) O(1) O(1)

    • 不依赖于输入规模,执行次数恒定。
    int a = 10;
    a = a + 1; // 常数时间
    
  2. 线性时间: O ( n ) O(n) O(n)

    • 基本操作执行次数与输入规模 n n n成正比。
    for (int i = 0; i < n; i++) {printf("%d\n", i); // 执行 n 次
    }
    
  3. 平方时间: O ( n 2 ) O(n^2) O(n2)

    • 嵌套循环中,每个循环迭代 n n n次,基本操作执行 n 2 n^2 n2次。
    for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {printf("%d, %d\n", i, j); // 执行 n * n 次}
    }
    
  4. 对数时间: O ( log ⁡ n ) O(\log n) O(logn)

    • 规模每次减小一半,通常出现在二分查找等算法中。
    while (low <= high) {mid = (low + high) / 2;if (arr[mid] == target)return mid;else if (arr[mid] < target)low = mid + 1;elsehigh = mid - 1;
    }
    
  5. 线性对数时间: O ( n log ⁡ n ) O(n \log n) O(nlogn)

    • 通常出现在分治算法(如归并排序)。
    void mergeSort(int arr[], int n) {if (n <= 1) return;int mid = n / 2;mergeSort(left, mid);mergeSort(right, n - mid);merge(left, right, arr); // 合并操作执行 O(n)
    }
    
  6. 指数时间: O ( 2 n ) O(2^n) O(2n)

    • 通常出现在递归枚举(如穷举法)。
    void subset(int[] arr, int n) {if (n == 0) return;subset(arr, n - 1);subset(arr + [arr[n]], n - 1); // 分成两种选择
    }
    

1.3 示例:时间复杂度的具体分析

示例 1:
for (int i = 0; i < n; i++) {printf("%d\n", i);
}
  • 基本操作:printf
  • 执行次数: n n n
  • 时间复杂度: O ( n ) O(n) O(n)
示例 2:
for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {printf("%d, %d\n", i, j);}
}
  • 基本操作:printf
  • 执行次数:外层循环执行 n n n次,内层循环每次执行 n n n次,总共 n × n = n 2 n \times n = n^2 n×n=n2 次。
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
示例 3:
int i = 1;
while (i <= n) {i *= 2;
}
  • 基本操作:i *= 2
  • 执行次数:每次迭代 i i i乘 2,最多执行 l o g 2 n log_2 n log2n 次。
  • 时间复杂度: O ( log ⁡ n ) O(\log n) O(logn)

2. 空间复杂度

空间复杂度描述算法运行时使用的额外内存随输入规模增长的关系,也用 大 O 表示法 表示。


2.1 空间复杂度的计算方法

  1. 统计额外变量

    • 计算算法使用的变量、数组、递归栈的大小。
  2. 输入空间不计入

    • 输入数组或数据结构的存储空间不属于额外空间。
  3. 递归调用的栈空间

    • 如果算法有递归,递归栈的深度乘以每层所需空间。

2.2 常见空间复杂度

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

    • 使用固定数量的变量,无论输入规模如何。
    int a = 0;
    a++;
    
  2. 线性空间: O ( n ) O(n) O(n)

    • 使用额外的数组或数据结构,大小与输入规模 n n n成正比。
    int* temp = (int*)malloc(n * sizeof(int));
    
  3. 递归栈空间: O ( n ) O(n) O(n)

    • 深度为 n n n的递归会使用 O ( n ) O(n) O(n) 的栈空间。
    void recursive(int n) {if (n == 0) return;recursive(n - 1);
    }
    

2.3 示例:空间复杂度的具体分析

示例 1:
int sum = 0;
for (int i = 0; i < n; i++) {sum += i;
}
  • 使用的额外变量:sumi,总共占用固定空间。
  • 空间复杂度: O ( 1 ) O(1) O(1)
示例 2:
int* temp = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {temp[i] = i;
}
  • 使用的额外空间:长度为 n n n的数组 temp
  • 空间复杂度: O ( n ) O(n) O(n)
示例 3:
void recursive(int n) {if (n == 0) return;recursive(n - 1);
}
  • 每次递归调用都会占用一个栈帧。
  • 如果递归深度为 n n n,栈空间总大小为 O ( n ) O(n) O(n)

3. 时间复杂度和空间复杂度的对比

算法类型时间复杂度空间复杂度
直接循环 O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)
嵌套循环 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
递归算法 O ( 2 n ) O(2^n) O(2n) O ( n ) O(n) O(n)
分治算法 O ( n log ⁡ n ) O(n \log n) O(nlogn) O ( n ) O(n) O(n)
动态规划 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2)

总结

  • 时间复杂度
    • 根据基本操作的执行次数,分析循环、分支、递归的增长趋势。
  • 空间复杂度
    • 根据额外变量、数组、递归栈的大小,估算内存使用的增长关系。

理解和计算复杂度需要结合实际代码逐行分析,尤其要关注循环和递归结构的执行规律。

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

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

相关文章

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…

Hadoop 学习心得

一、引言 &#xff08;一&#xff09;学习 Hadoop 的背景和目的 随着信息技术的飞速发展&#xff0c;数据量呈爆炸式增长&#xff0c;传统的数据处理方式已难以满足需求。在这样的背景下&#xff0c;为了能够在大数据领域有所发展&#xff0c;我开始学习 Hadoop。Hadoop 作为处…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

[控制理论]—位置式PID与增量式PID

位置式PID与增量式PID 1.位置式PID 按模拟PID控制算法&#xff0c;以一系列的采样时刻点kT代表连续时间t&#xff0c;以矩形法数值积分近似代替积分&#xff0c;以一阶后向差分近似代替微分&#xff0c;即&#xff1a; t ≈ k T &#xff08; k 0 , 1 , 2... &#xff09; …

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色&#xff0c;类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台&#xff0c;执行 Addressable Build 运行&#xff0c;加载 bundle 内的预制体 显示正常 2.Unit…

单片机学习笔记 6. 数码管动态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示 目录 0、实现的功能 1、Keil工程 1-1 数码管动态显示 1-2 数组的定义与引用…

车企如何实现安全图纸外发管理

车企面临着日益增长的数据交换需求&#xff0c;尤其是设计图纸等敏感数据的外发管理。如何确保这些数据在传输过程中的安全性和效率&#xff0c;是车企急需解决的问题。我们将从几个关键性的因素上来分析一下怎么实现安全图纸外发管理。 统一管理与授权 采用专业的文件交换系统…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法&#xff0c;产品质量是公司的信誉和品牌象征&…

Qt5/QPainter/画家

目录 1.绘制文字 1.1案例 1.2代码 2.画线 2.1案例 2.2代码 3.绘制矩形 3.1代码 4.绘制椭圆和圆 4.1椭圆 4.2圆 5.圆弧 5.1案例: 5.2代码 6.扇形 6.1案例 6.2代码: 7.更改绘画的颜色和粗细 7.1案例 ​编辑 7.2代码 1.绘制文字 1.1案例 通过三种不同的绘…

一篇保姆式centos/unbantu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;unbantu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest do…

fetch API和XHR

文章目录 一、基本写法1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 二、兼容性1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 三、Promise支持1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 四、请求响应1. XMLHttpRequest&#xff0…

Photoshop(PS)——人像磨皮

1.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…

Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!

作者&#xff1a;来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进&#xff0c;现在可供所有人使用。了解其架构和用例。 在这篇博文中&#xff0c;我们将再次深入探讨检索器&#xff08;retrievers&#xff09;。我们已经在之前的博文中讨论过它们&#xf…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…

c++类对象练习

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char* str); //构造函数void show(); //输出函数void setmystr(const mystring str); //设置函数const char* getmystr() co…

CH03_反射

第3章&#xff1a;反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候&#xff0c;就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …