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

目录

 

如何衡量一个代码的好坏

时间复杂度

概念

计算方法

实例计算

【实例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,一经查实,立即删除!

相关文章

搜维尔科技:Riablo提供一种创新的康复解决方案,通过激活本体感觉,并通过视听反馈促进神经肌肉的训练。

Riablo提供一种创新的康复解决方案&#xff0c;通过激活本体感觉&#xff0c;并通过视听反馈促进神经肌肉的训练。 搜维尔科技&#xff1a;Riablo提供一种创新的康复解决方案&#xff0c;通过激活本体感觉&#xff0c;并通过视听反馈促进神经肌肉的训练。

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

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

python数据预处理工作记录

检测string数据有nan值的情况 报错场景 titles json.loads(row[‘titles’].replace(“”, ‘"’)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: ‘float’ object has no attribute ‘replace’ 检测 import pandas as pdstring pd.NAif pd.isna(string):print(…

Jenkins教程-20-常用插件-Parameterized Trigger

上一小节我们学习了Jenkins常用插件Role-based Authorization Strategy的使用方法&#xff0c;本小节我们讲解一下Jenkins常用插件Parameterized Trigger的使用方法。 Jenkins 的 Parameterized Trigger 插件是一个非常实用的工具&#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 中仍然可以使用…

PHP 与 1688 详情 API 接口的完美对接

在当今数字化商业的浪潮中&#xff0c;实现 PHP 与 1688 详情 API 接口的无缝对接&#xff0c;对于开发者和企业来说具有重要的意义。这不仅能够获取丰富的商品详情数据&#xff0c;还能为电商业务的发展提供强大的支持。 一、1688 详情 API 接口概述 1688 详情 API 接口提供了…

MybatisPlus(MP)基础知识全解析

MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于Java的持久层框架&#xff0c;它在MyBatis的基础上提供了许多实用的功能增强&#xff0c;使得开发者可以更加便捷地进行数据库操作。本文将介绍MyBatis-Plus的基础知识&#xff0c;包括其特性、核心组件以及如何使用它进行…

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…

Python面试整理-Python的数据类型,分别有哪些?

Python有多种内置数据类型,主要分为数字类型、序列类型、集合类型和映射类型。以下是Python中常见的数据类型及其描述: 数字类型 1. 整数(int) 用于表示整数,例如:10, -5, 0 2. 浮点数(float) 用于表示小数,例如:3.14, -

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

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

消费者应该懂得消费知识点

目录 消费品&#xff1f; 便利品&#xff1a; 选购品&#xff1a; 特殊品&#xff1a; 消费者在消费前应该注意哪些事项&#xff1f; 消费品对于大家来说恐怕都不陌生&#xff0c;人们都知道消费品是用自己血汗钱换来的&#xff0c;仅仅知道这些还不够&#xff0c;作为消费…