数据结构和算法的概念以及时间复杂度空间复杂度详解

⭐️ 什么是数据结构?

百度百科给数据结构的定义:

数据结构(Data Structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

数据结构就是数据在内存中的存储方式。


⭐️ 什么是算法?

百度百科给算法的定义:

计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述

算法就是将输入数据转换成输出的结果。

注:数据结构和算法是相辅相成的。

💬 算法特点

  1. 有穷性。 (一个算法应包括有限的操作步骤,而不能是无限的。)
  2. 确定性。 (算法的每一个步骤应该是确定的,而不是模糊的。)
  3. 有零个或多个输入。
  4. 有一个或多个输出。 (没有输出的算法是没有意义的。)
  5. 有效性。 (算法的每一个步骤应当能有效的执行,并得到确定的结果。)

⭐️ 时间复杂度

百度百科时间复杂度的定义:

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况

算法中的基本操作的执行次数,为算法的时间复杂度。

💬 大O渐进表示法

  1. 用常数 1 取代运行时间中所有加法常数。
  2. 在修改后的运行次数函数中,保留最高次项。
  3. 如果最高次项系数不是 1,则去除这个最高次项的系数。

⭕️例1:

// count的执行次数是多少?
void Func1(int N)
{int count = 0;// 第一个循环for (int i = 0; i < N ; ++ i){for (int j = 0; j < N ; ++ j){++count;}}// 第二个循环for (int k = 0; k < 2 * N ; ++ k){++count;}// 第三个循环int M = 10;while (M--){++count;}
}

推导过程:

  外层循环执行一次内存循环就要执行 N N N 次,外层循环执行 N N N 次,那么内层循环也要执行 N N N次,所以第一个循环是执行的次数是 N 2 N^2 N2。第二个循环循环 2 N 2N 2N 次。第三个循环循环常数次 10 10 10 次。

执行次数: F ( N ) = N 2 + 2 N + 10 F(N) = N^2 + 2N + 10 F(N)=N2+2N+10

  • N = 1000 N = 1000 N=1000    F ( N ) = 1000 ∗ 1000 + 2 ∗ 1000 + 10 = 1002010 F(N) = 1000 * 1000 + 2 * 1000 + 10 = 1002010 F(N)=10001000+21000+10=1002010

实际中计算时间复杂度时,不需要计算精确的执行次数,而只需要大概的执行次数,所以这里用到了大O的渐进表示

从上面 N = 1000 N = 1000 N=1000 的例子中可以看出来,当 N N N 越来越大的时候,或者 N N N 趋于无穷的时候, 2 N 2N 2N 10 10 10就起不到作用了,甚至可以忽略不计

所以 例1 中函数的时间复杂度是 O ( N 2 ) O(N^2) O(N2)

⭕️例2:

// count的执行次数是多少?
void Func2(int N)
{int count = 0;// 第一个循环for (int k = 0; k < 2 * N ; ++ k){++count;}// 第二个循环int M = 10;while (M--){++count;}
}

推导过程:

第一个循环执行 2 N 2N 2N 次,第二个循环执行常数次 10 10 10 次。

执行次数: F ( N ) = 2 N + 10 F(N) = 2N + 10 F(N)=2N+10。 常数次 10 10 10 2 N 2N 2N 面前可以忽略不计,而里面最高次的系数是 2 2 2 也可以忽略不计。

所以 例2 的时间复杂度是 O ( N ) O(N) O(N)

⭕️例3:

int Func3(int * nums , int numsSize , int target)
{for (int i = 0; i < numsSize; i++) {if(nums[i] == target) {return i;}}return -1;
}

描述代码:Func3 代码是在数组中寻找一个目标值,如果找到目标值,则返回数组当前元素的下标,没有找到返回 -1

我们通过 例1例2 发现了大 O O O 渐进表示法去掉了对结果影响不大的项,简洁的表明了执行的次数。

那么有些算法的时间复杂度存在最好、平均、和最坏的情况。

比如 例3 这段代码:

  • 最好情况: 1 1 1 次找到
  • 最坏情况: N N N 次找到
  • 平均情况: N / 2 N/2 N/2 次找到

但是在实际中一般情况下我们只关注算法的最坏运行情况,所以 例3 的时间复杂度为 O ( N ) O(N) O(N)

⭕️例4:

void Func4(void)
{	int count = 0;for (int i = 0; i < 100; i++) {count++;}
}

例4 中的代码循环是固定的常数次 100 100 100 次,像一般常数级别的次数,时间复杂度用 O ( 1 ) O(1) O(1) 表示

注:O(1)代表是常数次,并不是一次的意思。

在这里插入图片描述


⭐️ 空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度算的是变量的个数。也使用大 O O O渐进表示法

像冒泡排序、选择排序…这些算法的空间复杂度是 O ( 1 ) O(1) O(1),因为这些算法只用了常数个变量。而一般的递归算法空间复杂度就是 O ( N ) O(N) O(N),每次递归函数都要开辟 N N N个栈帧,每个栈帧使用了常数个空间。

⭕️例5:

void Func5(int nums , int numsSize) {int * temp = (int*)malloc(sizeof(int) * numsSize);int end = numsSize - 1;for (int i = 0; i < numsSize; i++) {temp[i] = nums[end--];}for (int i = 0; i < numsSize; i++) {printf("%d " , temp[i]);}
}

例5 的代码动态的开辟了 numsSize 个空间,所以空间复杂度是 O ( N ) O(N) O(N)

注:空间复杂度还是要根据实际情况讨论,有些情况空间是会先创建再销毁重复利用空间的。

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

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

相关文章

Redis 持久化机制

Redis 是个基于内存的数据库。那服务一旦宕机&#xff0c;内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的&#xff0c;我们首先想到是可以从数据库中恢复&#xff0c;但是在由 Redis 宕机时&#xff08;说明相关工作正在运行&#xff09;且数据量很大情况…

【Go语言从入门到精通系列-基础篇】Go语言变量、常量和运算符:完全指南

系列文章目录 【Go语言从入门到精通系列-基础篇】Go安装 语言特性&#xff0c;以及开启你人生中的第一个go程序 【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。 Go语言从入门到精通系列-基础篇 系列文章目录前言一、变量和常量的基本概念1. 变量1.1 变…

如何做一份干净的git提交记录

背景 毕业工作有一些年头了&#xff0c;之前在写工作代码或者给开源项目贡献的时候&#xff0c;提交代码都不是很规范&#xff0c;甚至可以说十分的随意&#xff0c;想到什么就提交什么&#xff0c;根本没有管理提交记录的概念或者想法&#xff08;当你身边的人都不怎么在意的…

【Flutter】built_value 解决 Flutter 中的不可变性问题

文章目录 一、 前言二、 什么是 built_value&#xff1f;三、 为什么我们需要 built_value&#xff1f;四、 如何在 Flutter 中安装和设置 built_value&#xff1f;五、 如何使用 built_value 创建不可变的值类型&#xff1f;六、 如何使用 built_value 创建枚举类&#xff1f;…

瓶盖扫码回收APP系统 废旧物品创造价值收益

资源回收再利用是近些年国家大力倡导的&#xff0c;人们也在积极践行&#xff0c;从垃圾回收、废旧衣物回收、烟盒回收等等.....今天小白要带大家了解的是瓶盖回收APP软件开发的相关事项。瓶盖回收APP是本着资源回收的初衷&#xff0c;可以时间废旧瓶盖的多次利用&#xff0c;减…

Springboot的自动装配解读

目录 1.Springboot的自动装配 1.1 组件装配 1.1.1 组件 1.2 Spring Framework 的模块装配 1.2.1 Import注解 1.2.2 BeanDefinition 1.3 Spring Framework 的条件装配 1.3.1 Profile 1.3.2 Conditional 1.3.3 MetaData元数据接口&#xff08;补充&#xff09; Annot…

LLM - Hugging Face 工程 BERT base model (uncased) 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131400428 BERT是一个在大量英文数据上以自监督的方式预训练的变换器模型。这意味着它只是在原始文本上进行预训练&#xff0c;没有人以…

报错:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

1.背景 编译项目或启动项目报错 2.解决方法 设置为对应的版本 3.完美

mybatis 模拟03

pom.xml: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

【python】—— 基础语法(二)

序言&#xff1a; 在上期&#xff0c;我们已经对python进行了初步的学习和了解。本期&#xff0c;我将继续带领大家学习关于python的基本知识&#xff01;&#xff01; 目录 &#xff08;一&#xff09;顺序语句 &#xff08;二&#xff09;条件语句 1、什么是条件语句 2、…

Vue2封装一个全局通知组件并发布到NPM

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击查看更多 &#x1f310;关键&#xff1a;vue2 组件封装 npm发包 文章目录 1. 前言 &#x1f343;2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

EasyDSS视频直播点播平台视频回看列表显示为ID的排查与优化

视频直播点播EasyDSS平台具备灵活的视频能力&#xff0c;包括直播、点播、转码、管理、录像、检索、时移回看等&#xff0c;平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等能力服务&#xff0c;可应用在无人机推流、在线直播、虚拟直播、远程培训等场景中。…