【数据结构】:时间和空间复杂度在这篇里面一点都不复杂

目录

 

如何衡量一个代码的好坏

时间复杂度

概念

计算方法

实例计算

【实例1】

【实例2】

【实例3】

【实例4】:冒泡排序的时间复杂度

【实例5】:二分查找的时间复杂度

【实例6】:阶乘递归的时间复杂度

 

【实例7】:斐波那契递归的时间复杂度

空间复杂度

概念

实例计算

【实例1】:冒泡排序的空间复杂度

【实例2】:斐波那契的空间复杂度


 

如何衡量一个代码的好坏

  • 算法效率分析分为两种
  1. 时间效率,称为时间复杂度,主要是用来衡量算法的运行速度
  2. 空间效率,称为空间复杂度,主要是用来衡量实现一个算法需要的额外空间

 

时间复杂度

概念

定义

  • 算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间
  • 一个算法所花费的时间与其语句中的执行次数成正比,算法中的基本操作的执行次数,为算法的时间复杂度

 

计算方法

void func1(int N){int count = 0;for (int i = 0; i < N ; i++) {    for (int j = 0; j < N ; j++) {       count++;       //————>N*N}   }for (int k = 0; k < 2 * N ; k++) {count++;           //————>N*2}    int M = 10;    while ((M--) > 0) {        count++;           //————>10}    System.out.println(count); 
}

Func1执行的基本操作次数为:

eq?%24F%28N%29%3DN%5E2&plus;2*N&plus;1%24

  • N = 10        F(N) = 130
  • N = 100      F(N) = 10210
  • N = 1000    F(N) = 1002010

 

推导大O阶方法大O符号,用于描述函数渐进行为的数学符号

  • 用常数 1 取代运行时间中的所有加法常数
  • 在修改后的运行次数函数中,只保留最高项
  • 如果最高阶存在且不为 1,则去除与这个项相乘的常数
  • 使用大O阶渐进表示法后,func的时间复杂度为:eq?%24N%5E2%24

 

实例计算

【实例1】

//计算func2的时间复杂度
void func2(int N) {    int count = 0;    for (int k = 0; k < 2 * N ; k++) {        count++;         //————>N*2}    int M = 10;    while ((M--) > 0) {        count++;         //————>10}    System.out.println(count); 
}
  • func2的时间复杂度为:eq?%24O%28N*2&plus;10%29%24 即 eq?%24O%28N%29%24

 

【实例2】

//计算func3的时间复杂度
void func3(int N, int M) {    int count = 0;    for (int k = 0; k < M; k++) {        count++;     //————>M}    for (int k = 0; k < N ; k++) {        count++;     //————>N}    System.out.println(count); 
}
  • func3的时间复杂度为:eq?%24O%28M&plus;N%29%24

 

【实例3】

// 计算func4的时间复杂度
void func4(int N) {   int count = 0;    for (int k = 0; k < 100; k++) {        count++;       //————>100}    System.out.println(count); 
}
  • func4的时间复杂度为:eq?%24O%281%29%24

 

【实例4】:冒泡排序的时间复杂度

// 计算bubbleSort的时间复杂度
void bubbleSort(int[] array) {    for (int end = array.length; end > 0; end--) {  //————>(N-1)项boolean sorted = true;        for (int i = 1; i < end; i++) {      //———>(N-1)+(N-2)+(N-3)+...+1if (array[i - 1] > array[i]) {   //等差数列求和,首:N-1  末:1  项数:N-1Swap(array, i - 1, i);                sorted = false;           }       }        if (sorted == true) {            break;       }   } 
}
  • 第11,12行对代码进行了优化,时间复杂度为:eq?%24O%28N%29%24
  • 若无优化,最好和最坏的结果都是:eq?%24O%28%5Cfrac%7BN%5E2-N%7D%7B2%7D%29%24 即 eq?%24O%28N%5E2%29%24

 

 

【实例5】:二分查找的时间复杂度

// 计算binarySearch的时间复杂度
int binarySearch(int[] array, int value) {    int begin = 0;    int end = array.length - 1;    while (begin <= end) {                   int mid = begin + ((end-begin) / 2);        if (array[mid] < value)            begin = mid + 1;        else if (array[mid] > value)            end = mid - 1;        else;return mid;   }    return -1; 
}
  • 分一次,还剩 eq?%24%5Cfrac%7Bn%7D%7B2%7D%24 个数;分两次,还剩 eq?%24%5Cfrac%7Bn%7D%7B2%5E2%7D%24 个数......分 eq?%24x%24 次,还剩 eq?%24%5Cfrac%7Bn%7D%7B2%5Ex%7D%24 个数。
  • 在结果最坏时,当只有一个剩余的数的时候,就找到了,所以此时  eq?%24%5Cfrac%7Bn%7D%7B2%5Ex%7D%20%3D%201%24  ,即 eq?%24n%3D%202%5Ex%24
  • binarySearch的时间复杂度为:eq?%24O%28log_2n%29%24

 

 

【实例6】:阶乘递归的时间复杂度

// 计算阶乘递归factorial的时间复杂度
long factorial(int N) { return N < 2 ? N : factorial(N-1) * N; 
}
  • 递归的复杂度 = 递归的次数 * 每次递归后代码的执行次数
  • 递归的次数为N;每次递归回来执行三目运算,它的时间复杂度为 eq?%24O%281%29%24
  • 阶乘递归的时间复杂度为:eq?%24O%28N*1%29%20%3D%20O%28N%29%24

 

 

【实例7】:斐波那契递归的时间复杂度

// 计算斐波那契递归fibonacci的时间复杂度
int fibonacci(int N) { return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2); 
}

e3abd0c204c143fbb8c795eee9f4c4c6.png

  • 第 n 层节点个数为:eq?%242%5E%7Bn-1%7D%24 ,则总递归次数为:
  • eq?%242%5E0&plus;2%5E1&plus;2%5E2&plus;...&plus;2%5E%7Bn-1%7D%3D%5Cfrac%7B1*%281-2%5E%7Bn-1%7D%29%7D%7B1-2%7D%3D2%5En-1%24
  • 每次递归后代码执行三目运算,时间复杂度为:eq?%24O%281%29%24
  • 斐波那契递归的时间复杂度为:eq?%24O%282%5En*1%29%3DO%282%5En%29%24

 

 

空间复杂度

概念

  • 空间复杂度是对一个算法在运行过程中,临时占用存储空间大小的量度。
  • 计算规则基本上与时间复杂度一样,也使用大O渐进法表示

 

 

实例计算

【实例1】:冒泡排序的空间复杂度

// 计算bubbleSort的空间复杂度
void bubbleSort(int[] array) {    for (int end = array.length; end > 0; end--) {        boolean sorted = true;        for (int i = 1; i < end; i++) {            if (array[i - 1] > array[i]) {                Swap(array, i - 1, i);                sorted = false;           }       }        if (sorted == true) {            break;       }}
}
  • 空间复杂度为:eq?%24O%281%29%24

 

 

【实例2】:斐波那契的空间复杂度

// 计算fibonacci的空间复杂度
int[] fibonacci(int n) {    long[] fibArray = new long[n + 1];    fibArray[0] = 0;    fibArray[1] = 1;    for (int i = 2; i <= n ; i++) {    fibArray[i] = fibArray[i - 1] + fibArray [i - 2];   }    return fibArray; 
}
  • 空间复杂度为:eq?%24O%28N%29%24

 

【实例3】:阶乘递归的空间复杂度

// 计算阶乘递归Factorial的空间复杂度
long factorial(int N) { return N < 2 ? N : factorial(N-1)*N; 
}
  • 空间复杂度为:eq?%24O%28N%29%24

 

 

 

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

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

相关文章

独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统

目录 一、进出口清单 二、路径计算 三、包裹 1.包裹的数据结构 2.包裹在场景中的运动 四、道路 1.道路的数据结构 2.道路的建造 3.道路的销毁 4.某个有道路连接的建筑被删除 作为一个工厂类模拟经营游戏&#xff0c;各个工厂之间的运输必不可少&#xff0c;本游戏采用的…

SQLite数据库在Android中的使用

目录 一&#xff0c;SQLite简介 二&#xff0c;SQLIte在Android中的使用 1&#xff0c;打开或者创建数据库 2&#xff0c;创建表 3&#xff0c;插入数据 4&#xff0c;删除数据 5&#xff0c;修改数据 6&#xff0c;查询数据 三&#xff0c;SQLiteOpenHelper类 四&…

学习008-02-01-05 Configure a One-to-Many Relationship(配置一对多关系)

Configure a One-to-Many Relationship&#xff08;配置一对多关系&#xff09; This lesson explains how to create a One-to-Many relationship between two entities and how XAF generates the UI for such a relationship. 本课介绍如何在两个实体之间创建一对多关系以及…

nginx高可用实例

什么是nginx高可用 为什么需要高可用 正常情况下使用nginx&#xff0c;浏览器访问网址到nginx服务器&#xff0c;nginx再发送到目标服务器&#xff0c;获取资源返回。 但是会有一个问题&#xff1a;当nginx进程发生宕机&#xff0c;此时目标服务器存在&#xff0c;但是浏览器访…

Vue入门之v-for、computed、生命周期和模板引用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Linux系统下U-Boot基本操作——UBoot基础知识

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

React基础学习-Day08

React基础学习-Day08 React生命周期&#xff08;旧&#xff09;&#xff08;新&#xff09;&#xff08;函数组件&#xff09; &#xff08;旧&#xff09; 在 React 16 版本之前&#xff0c;React 使用了一套不同的生命周期方法。这些生命周期方法在 React 16 中仍然可以使用…

django报错(二):NotSupportedError:MySQL 8 or later is required (found 5.7.43)

执行python manage.py runserver命令时报版本不支持错误&#xff0c;显示“MySQL 8 or later is required (found 5.7.43)”。如图&#xff1a; 即要MySQL 8或更高版本。但是企业大所数用的还是mysql5.7相关版本。因为5.7之后的8.x版本是付费版本&#xff0c;贸然更新数据库肯定…

RK3562 NPU开发环境搭建

如何在Ubuntu系统&#xff08;PC&#xff09;上搭建RK3562 Buildroot Linux的NPU开发环境&#xff1f;即电脑端运行Ubuntu系统&#xff0c;而RK3562板卡运行Buildroot Linux系统的情况下&#xff0c;搭建RK3562 NPU开发环境。 下面是相应的步骤&#xff08;对应的命令&#xf…

DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看

DICOM CT\MR片子免费在线查看工具 参考&#xff1a; https://zhuanlan.zhihu.com/p/668804209 dicom格式&#xff1a; DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是医学数字成像和通信的标准。它定义了医学图像&#xff08;如CT、MRI、X…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

ChatTTS超强的真人AI语音助手下载使用教程

简介 ChatTTS是专门为对话场景设计的文本转语音模型&#xff0c;支持多人同时对话&#xff0c;适用的场景非常丰富&#xff0c;比如LLM助手对话任务&#xff0c;视频配音、声音克隆等。同时支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练&#xf…

AI 基于病理图像分析揭示了一种不同类型的子宫内膜癌| 文献速递-基于人工智能(AI base)的医学影像研究与疾病诊断

Title 题目 AI-based histopathology image analysisreveals a distinct subset of endometrialcancers AI 基于病理图像分析揭示了一种不同类型的子宫内膜癌。 01 文献速递介绍 子宫内膜癌&#xff08;EC&#xff09;有四种分子亚型&#xff0c;具有很强的预后价值和治疗…

如何安装Visual Studio Code

Visual Studio Code&#xff08;简称 VS Code&#xff09; Visual Studio Code 是一款由微软开发的免费、开源的现代化轻量级代码编辑器。 主要特点包括&#xff1a; 跨平台&#xff1a;支持 Windows、Mac 和 Linux 等主流操作系统&#xff0c;方便开发者在不同平台上保持一…

二叉树 初阶 总结

树的基础认知 结点的度&#xff1a;一个结点含有的子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的为6 叶结点或终端结点&#xff1a;度为0的结点称为叶结点&#xff1b; 如上图&#xff1a;B、C、H、I...等结点为叶结点 非终端结点或分支结点&#xff1a;度不为0…

采用T网络反馈电路的运算放大器(运放)反相放大器

运算放大器(运放)反相放大器电路 设计目标 输入电压ViMin输入电压ViMax输出电压VoMin输出电压VoMaxBW fp电源电压Vcc电源电压Vee-2.5mV2.5mV–2.5V2.5V5kHz5V–5V 设计说明1 该设计将输入信号 Vin 反相并应用 1000V/V 或 60dB 的信号增益。具有 T 反馈网络的反相放大器可用…

【鸿蒙学习笔记】位置设置・position・绝对定位・子组件相对父组件

官方文档&#xff1a;位置设置 目录标题 position・绝对定位・子组件相对父组件Row Text position position・绝对定位・子组件相对父组件 正→ ↓ Row Text position Entry Component struct Loc_position {State message: string Hello World;build() {Column() {Co…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

Elasticsearch:如何选择向量数据库?

作者&#xff1a;来自 Elastic Elastic Platform Team 向量数据库领域是一个快速发展的领域&#xff0c;它正在改变我们管理和搜索数据的方式。与传统数据库不同&#xff0c;向量数据库以向量的形式存储和管理数据。这种独特的方法可以实现更精确、更相关的搜索&#xff0c;并允…

【HarmonyOS】关于鸿蒙消息推送的心得体会 (一)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;一&#xff09; 前言 这几天调研了鸿蒙消息推送的实现方式&#xff0c;形成了开发设计方案&#xff0c;颇有体会&#xff0c;与各位分享。 虽然没做之前觉得很简单的小功能&#xff0c;貌似只需要和华为服务器通信&…