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

news2025/4/17 10:56:10

时间复杂度与空间复杂度

  • 1.📉 时间复杂度
    • 📌1.1 时间复杂度的概念
    • 1.2 大O的渐进表示法
  • 🏰空间复杂度
  • 📃例题分析
    • 1.案例(常数阶)
    • 2.案例(线性阶)
    • 3.案例:(平方阶)
    • 4.案例(平方阶)
    • 5.案例(对数阶)
    • 6.案例(递归调用)
  • ❗️总结:

在这里插入图片描述

1.📉 时间复杂度

📌1.1 时间复杂度的概念

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

1.2 大O的渐进表示法

O符号(Big O notation):是用于描述函数渐进行为的数学符号。

🔸推导大O阶方法:
1、O(1)用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中, 只保留最高阶项
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
🔹常见时间复杂度:( 复杂度由小到大

常数阶O(1)
线性阶O(n)
对数阶O(logn)
nlogn阶O(nlogn)
平方阶O(n^2)
立方阶O(n^3)
指数阶O(2^n)

🔸大O阶的三种情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
:我们一般都取最坏的情况作为这个算法的时间复杂度。

🏰空间复杂度

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

空间复杂度一般都为O(N);
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

📃例题分析

1.案例(常数阶)

int fun(int n)
{
  int i = 0;int cnt = 0;
   for( i; i<100;i++)
     {
       cnt++;
      }
  return cnt;
}

此时时间复杂度为O(1),这里的1不是指一次,而是常数次,该循环执行了100次,不管n多大,他都执行100次,所以是O(1)常数阶。

2.案例(线性阶)

分析下面代码复杂度

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

这里的时间复杂度是O(M+N);
因为我们并不知道M和N谁大,所以我们不能舍弃任何一个。
假如:M无穷大,那么时间复杂度为O(M);反之亦然。

3.案例:(平方阶)

分析下面代码的时间复杂度

int fun(int n)
{
   int cnt = 0;
  for(int i = 0;i < n;i++)
   {
     for(int j = 0; j<n; j++)
      {
        cnt++; 
      }
   }//两层循环,每次循环n次,因此为n*n
 
 
  for(int k = 0; k<n; k++)
   {
     ++cnt;
   }//一层循环,循环n次
  
  for(int l = 0;l<10;l++)
   {
     ++cnt;
   }//一层循环,循环10次
 
return cnt;
}

我们列出计算时间的复杂度的表达式:n*n +n +10。但是我们能写成O(N*N+N+10吗?我们知道,对于时间复杂度我们不需算出精确的数字,只需要算出这个算法属于什么量级即可,我们又如何知道它属于哪个量级呢?即,我们将字母取无穷大,例如本题中字母为n,n取无穷大,而十对于n取无穷大后没有影响,因此10可以舍去,原表达式化为nn+n,再转化为n(n+1),由于n为无穷大,因此-1也是没有影响的,原式就变成了O(N*N)=O(N^2)
📌 在这里我们使用大O渐近表示法,只是一种量级的估算,而不是准确的值。

4.案例(平方阶)

分析冒泡排序的时间复杂度

void bubblesort(int* a,int n)
{
   assert(a);
for(int end = n; end>0; end--)
    {
      int exchange = 0;
       for(int i = 1; i<end; i++)
           {
              if(a[i-1]>a[i])
              {
                swap(&a[i],&a[i-1]);
                 exchange = 1;
               }
            }
    
       if(exchange==0)
           break;
     }
}

在这个冒泡排序中,我们需要将无序数组转化为有序数组的一种算法,它并不是简单的双层嵌套循环,很容易想到它的循环次数是一个等差数列,第一次循环n-1次,第二次n-2次…一直到1.因此为n-1+n-2+n-3…+1 =·n*(n-1)/2,使用大O表示,去掉影响不大的项,简化为: 时间复杂度为O(N*N)

5.案例(对数阶)

二分查找

int binary(int n, int a[], int k) 
{
	int left = 0, right = n - 1;
	while(l <= r) {
		mid = (l + r)/2;
		if(a[mid] == k) 
		    return mid;
		else if(a[mid] < k)
			right = mid + 1;
		else
			left = mid + 1;
	}
	return -1;
}

eft和right指数组最左边和最右边的下标.每次将这个数组砍一半,求出mid中间下标. 由于是升序排列,如果中间下标代表的数大于给定的数k,那么k必定在中间下标的左边. 那么就将mid+1的值赋给right,反之则将mid+1的值赋给left,每次将数组砍一半直到找到数k为止.
也就是每次除二。2^n=N -> n=logN;

6.案例(递归调用)

斐波那契函数

long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

推到知道,这个函数会不停的向下调用,呈金字塔型,虽然运算量非常大,但是我们在算时间复杂度时要关注代码的思想,而不是看它的次数等。 递归函数的时间复杂度是多次用的次数的累加
空间复杂度:根据调用的次数,每次都会占用栈上的空间,所以间复杂度为O(N);

❗️总结:

不管是算时间复杂度,还是空间复杂度。我们都要根据代码的思想,探求程序运行的过程,来思考复杂度。不能片面的根据数量,次数的多少来算。

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

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

相关文章

香港中文大学多媒体实验室——人工智能与计算机视觉的创新引擎

原创 | 文 BFT机器人 01 引言 香港中文大学多媒体实验室&#xff08;MultimediaLaboratory&#xff09;成立于2001年7月&#xff0c;是香港中文大学信息工程学系的重要组成部分。该实验室由汤晓鸥教授执导&#xff0c;是最早应用深度学习进行计算机视觉研究的华人团队之一。因…

Latex | 将MATLAB图并导入Latex中的方法

一、问题描述 用Latex时写paper时&#xff0c;要导入MATLAB生成的图进去 二、解决思路 &#xff08;1&#xff09;在MATLAB生成图片的窗口中&#xff0c;导出.eps矢量图 &#xff08;2&#xff09;把图上传到overleaf的目录 &#xff08;3&#xff09;在文中添加相应代码 三…

麒麟v10-coredns 启动失败

现象 在麒麟ARM芯片的机器上搭建k8s&#xff0c;其中的的一个组件cordons 发现启动失败&#xff0c;查看日志如下所示&#xff1a;No such device or address 问题分析 期初猜测kubelet与containerd的cgroupDriver驱动不一致导致。分别查看是一致的。没有问题。发现系统存在…

阿里云NVIDIA A100 GPU云服务器性能详解及租用费用

阿里云GPU服务器租用费用表包括包年包月、一个小时收费以及学生GPU服务器租用费用&#xff0c;阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折&#xff0c;阿里云百科分享阿里云GPU服务器租用表、GPU一个小时多少…

javafx拖拽图片实现

效果 代码 package cn.juhe.zjsb.test;import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javaf…

jmeter接口自动化测试工具在企业开展实际的操作

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

SAFe工具,SAFe规模化敏捷工具,SAFe实施流程,SAFe框架管理工具

​Leangoo领歌敏捷工具覆盖了敏捷项目研发全流程&#xff0c;包括小型团队敏捷开发&#xff0c;Scrum of Scrums大规模敏捷。 随着SAFe的越来越普及&#xff0c;Leangoo本次上线提供了完整的SAFe框架功能&#xff0c;包括&#xff1a;Program Backlog&#xff0c;PI规划&#…

Linux相关指令(上)

常见指令&#xff1a; 1 pwd&#xff1a;查看用户当前所在目录 以下面的路径为例&#xff1a; 2 ls&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。 对于文件&#xff0c;将列出文件名以及其他信息 ls-l&#xff08;or ll&#xff09;&#xff1a;列…

插槽slot复习

1.认识插槽 ◼ 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a;  前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;  但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的div、span等等…

学生公寓报修管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的发展&#xff0c;信息化的管理手段早以在人们生活的各个方面取代了传统的管理手段&#xff0c;以先进管理理念为基础的现代化信息管理系统已经成为了许多机构的必备工具。在如今大学的校园里&#xff0c;有着许许多多的信息化管理系统&#xff0c;如图书管理系…

面试官:Redis 为什么变慢了?怎么解决?

一、Redis为什么变慢了 二、Redis如何优化 三、Redis变慢了排查步骤 一、Redis为什么变慢了 1.Redis真的变慢了吗&#xff1f; 对 Redis 进行基准性能测试 例如&#xff0c;我的机器配置比较低&#xff0c;当延迟为 2ms 时&#xff0c;我就认为 Redis 变慢了&#xff0c;…

Qt : day2

1. #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug() << this->size(); //获取当前页面尺寸this->setFixedSize(500, 600); //设置固定尺寸this->setWindowTitle("聊天框"); //设置窗口标题thi…

快速批量处理,高效添加水印的软件推荐

辛迪&#xff1a;嘿&#xff0c;你听说过加水印技术吗&#xff1f; 杰克&#xff1a;当然啦&#xff01;那是一种在图像或视频上添加标识的技术&#xff0c;对吧&#xff1f; 辛迪&#xff1a;没错&#xff01;加水印技术可以在作品上添加标识、文字、图像等&#xff0c;以保…

Python实现HBA混合蝙蝠智能算法优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

【计算机】磁盘基础知识

一、背景前言 今年2023年&#xff0c;已经是机械硬盘诞生的第67个年头了。作为存储数据的硬件设备&#xff0c;它的发展可谓历经了很多人的努力&#xff0c;在这个过程中也发现很多有意思的事情。通常在生活中&#xff0c;不太懂计算机的朋友们常把内存与硬盘的概念混淆&#…

怎么把图片压缩小一点?三招教会你压缩图片

在现如今的互联网时代&#xff0c;图片是我们日常生活中不可或缺的一部分&#xff0c;无论是在社交媒体上分享照片&#xff0c;还是在网站上发布图片&#xff0c;我们都希望图片能够加载得更快&#xff0c;占用更少的存储空间。因此&#xff0c;将图片压缩变得尤为重要&#xf…

C# 用队列实现栈

225 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返…

Java训练四

目录 一、简易计算器 二、购买电影票 三、计算平均分 四、厘米与英寸互转 一、简易计算器 使用静态方法模拟一个只能进行两个数加、减、乘、除的建议计算器。 package haha; import java.util.Scanner; public class Dog{ public static double jia(double a,double b)…

大语言模型LLM

目录 一、语言模型的发展 语言模型&#xff08;Language Model&#xff0c;LM&#xff09;目标是建模自然语言的概率分布&#xff0c;具体目标是构建词序列w1,w2,...,wm的概率分布&#xff0c;即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…

Consul 容器服务更新与发现

Consul 容器服务更新与发现/docker 安全/ssl证书管理 文章目录 Consul 容器服务更新与发现/docker 安全/ssl证书管理一、consul详解1.consul模式2.consul关键特性 二、consul部署1.实验部署2.实验步骤consul服务器registrator服务器consul-templateconsul 多节点 三、Docker安全…