数据结构--时间复杂度与空间复杂度

数据结构–时间复杂度与空间复杂度

文章目录

  • 数据结构--时间复杂度与空间复杂度
  • 时间复杂度
  • 一、什么是时间复杂度
  • 二、具体实例
    • 1.大O的渐进表示法
    • 2.二分查找的时间复杂度
  • 空间复杂度
  • 一、什么是空间复杂度
  • 二、具体实例
  • 总结


时间复杂度

一、什么是时间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有程序在机器上跑起来,才能知道,但是如果所有的算法都需要在机器上运行起来去测试时间复杂度就会很麻烦,所以才有了时间复杂度这个分析方式,一个算法所花费的时间与其中语句的执行次数成正比例,算法的基本操作的执行次数,为算法的时间复杂度。

二、具体实例

1.大O的渐进表示法

代码如下(示例):

// 请计算一下Func1中++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;}printf("%d\n", count);
}

F(N) = N^2 + 2*N + 10 这是++count的具体运行次数,但是对于大O的渐进表示法,在修改后的运行次数函数中,只保留最高阶项,所以Func1的时间复杂度应为:O(N^2)

// 计算Func2的时间复杂度?> void Func2(int N)
> {
> 	int count = 0;
> 	for (int k = 0; k < 2 * N ; ++ k)
> 	{
> 		++count;
> 	}
> 
> 	int M = 10;
> 	while (M--)
> 	{
> 		++count;
> 	}
> 
> 	printf("%d\n", count);
> }

Func2(N) = 2*N + 10 这是++count的具体运行次数,但是对于大O的渐进表示法,如果最高阶项存在,则去除与这个项目相乘的常数。得到的结果就是大O阶。所以Func2的时间复杂度为:O(N)

> // 计算Func4的时间复杂度?
> void Func4(int N)
> {
> 	int count = 0;
> 	for (int k = 0; k < 100; ++ k)
> 	{
> 		++count;
> 	}
> 	printf("%d\n", count);
> }

Func4的时间复杂度是常数次,所以统一使用O(1)来表示,1不是指一次,而是指常数次

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{if(N < 3)return Fib(N-1) + Fib(N-2return 1;
);
}

通过计算分析发现基本操作递归了2^N次 ,时间复杂度为O(2^N)

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{if(0 == N)return 1;return Fac(N-1)*N;
}

通过计算分析发现基本操作递归了N次,时间复杂度为O(N)。

2.二分查找的时间复杂度

代码如下(示例):

int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;// [begin, end]:begin和end是左闭右闭区间,因此有=号while (begin <= end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid - 1;elsereturn mid;}return -1;
}

最坏情况就是:区间缩放到一个值时,要么找到,要么找不到,假设N是数组个数,X是最坏查找次数:
N/2/2/2/…/2 = 1
折半查找多少次就除多少个2
用数学表达式应为:2^X = N
则时间复杂度应为
在这里插入图片描述


空间复杂度

一、什么是空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

二、具体实例

代码如下(示例):

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}
  1. 冒泡排序算法里面的数组属于本身就存在的,不是临时创建的,是因为有数组存在,有排序的需求,才会有这个排序算法。
  2. 临时占用存储空间的大小指的是创建额外的空间
  3. 这个代码里面临时创建了 n ;end;exchange;i;常数个变量,所以是O(1)。
// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{if(n==0)return NULL;long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; ++i){fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray;
}
  1. 这个数组就是额外开辟的,为了计算斐波那契数列而开辟的,所以空间复杂度就是O(N)。
// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}
  1. 递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

总结

  1. 计算时间复杂度最好的办法就是画图,数循环次数很容易出错误
  2. 常见的复杂度
    在这里插入图片描述
  3. 复杂度的变化速率
    在这里插入图片描述

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

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

相关文章

华为数通智选交换机S5735S-L24T4S-QA2无法SSH远程访问

以前都是按照华为S5700交换机开启SSH远程访问方法配置不同网段通过静态路由实现互通,华为S5700交换机开启ssh远程登陆,现在新买的华为数通智选交换机S5735S-L24T4S-QA2,也是按照这步骤配置,令人不解的是,竟然无法ssh访问,仔细看了配置也没有发现问题,在华为eNSP模拟器上验…

C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

目录 0. 前言map/set和unordered_map/unordered_set 1. unordered系列关联式容器 1.1 unordered_map 1.1.2 unordered_map的接口说明 1. unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6…

基于STM32的智能喂养系统

基于STM32的智能喂养系统 系统简介 自动检测环境温湿度&#xff0c;当温湿度低于阈值时自动打开加湿器&#xff1b;自动检测水位&#xff0c;当水位低于阈值时自动加水&#xff1b;自动检测有害气体&#xff0c;当检测到有害气体时自动打开风扇&#xff1b;同步状态到微信小程…

一文看懂《关于网络安全和信息化工作重要指示》

7月14日至15日&#xff0c;全国网络安全和信息化工作会议在京召开。《关于网络安全和信息化工作重要指示》也在会上得到解读与传达。 从近年来党的二十大等重大会议上网络安全和数据安全等相关话题多次被提及、我国陆续发布多部网络安全&数据安全相关政策法规等等&#xf…

机器学习1

核心梯度下降算法&#xff1a; import numpy as np from utils.features import prepare_for_trainingclass LinearRegression:def __init__(self,data,labels,polynomial_degree 0,sinusoid_degree 0,normalize_dataTrue):"""1.对数据进行预处理操作2.先得到…

【原创】实现ChatGPT中Transformer模型之输入处理

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Inputs Process&#xff08;输入处理层&#xff09;实现 我们看整个绿色框的整个位置&#xff0c;就是Inputs Process&#xff08;输入处理层&#xff09;。 在输入处理层&#xff0c;其实非常容易理解&#xff0c;主要就…

springboot与rabbitmq的整合【演示5种基本交换机】

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;后端专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

C语言-ubuntu下的命令

目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务&#xff1a; linux命令 【1】打开关闭终端 打开终端&#xff1a; 1. 直接点击 …

数学建模的赛题类型

一、预测类 指通过分析已有的数据或者现象&#xff0c;找出其内在发展规律&#xff0c;然后对未来情形做出预测的过程。 根据已知条件和求解目的&#xff0c;往往将预测类问题分为&#xff1a;小样本内部预测&#xff0c;大样本内部预测。 解决预测类赛题的一般步骤&#xff…

vue3 实现 Map 地图区域组件封装

图例&#xff1a;重庆区域 一、安装echarts 坑&#xff1a;地图echarts版本必须在5.0.0以下&#xff0c;否则不能显示&#xff0c;此处指定安装 echarts4.9.0 即可 cnpm install echarts4.9.0 --save 二、下载 “重庆” 区域地图json文件 下载地址&#xff1a;https://www.…

『表面』在平面模型上提取凸(凹)多边形

原始点云 直通滤波,z轴0~1.1 分割模型为平面&#xff0c;分割结果进行投影 提取多边形 代码: #include <pcl/ModelCoefficients.h> // 模型系数的数据结构&#xff0c;如平面、圆的系数 #include <pcl/io/pcd_io.h>#include <pcl/point_types.h> // 点云数据…

TCP和UDP的区别

连接&#xff1a;TCP 是面向连接的传输层协议&#xff0c;传输数据前先要建立连接&#xff1b;UDP 是不需要连接&#xff0c;即刻传输数据。首部开销&#xff1a;TCP 首部长度较长&#xff0c;首部在没有使用「选项」字段时是 20 个字节&#xff0c;如果使用了「选项」字段则会…