【No.01】复杂度|时间复杂度|空间复杂度

VTK基础教程(1)- vtkPolyData 介绍 目录 VTK的编译与环境搭建 VTK一般渲染流程 VTK数据类型-vtkPolyData 使用vtk自带的多边形数据 使用自己创建的数据 添加顶点颜色 添加面颜色 VTK的编译与环境搭建 这部分目前已经有了大佬做了成熟的傻瓜式配置,大家可以参考这篇文章:VTK+VS2019(或其他版本均可) 傻瓜式一站式 配置_Nancy_fairy的博客-优快云博客_vs2019 vtk VTK一般渲染流程 这部分的介绍也很多,大家可以参考这篇文章:VTK笔记-了解VTK_黑山老妖的博客. 阅读详情
数据结构

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

算法

定义良好的计算过程,取一个或一组的值为输入,产生一个或一组值作为输出。简单来说就是一系列的计算步骤,用来将输入数据转化成输出结果。

算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。

时间复杂度

定义:
在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。
实际中我们计算时间复杂度时,并不一定要计算精确的执行次数,只需要大概执行次数,这里使用大O的渐进表示法。

  • 抓大头
  • 取具有决定性结果的那一项
大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

  1. 用常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶
    大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数
时间复杂度分类

最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

冒泡排序的时间复杂度
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;  
	}  
}

设共有n个数,冒第一个数,第一趟需要n-1次
第二趟n-2次,第三趟n-3次
等差数列
1+⋯+(n−3)+(n−2)+(n−1) 1+\dots+(n-3)+(n-2)+(n-1) 1+⋯+(n−3)+(n−2)+(n−1)
(首项+尾项)∗项数2=(1+n−1)∗n2=n22=O(n2) \begin{array}{} \frac{(首项+尾项)*项数}{2} \\ =\frac{(1+n-1)*n}{2} \\ =\frac{n^{2}}{2} \\ =O(n^{2}) \end{array} 2(首项+尾项)∗项数​=2(1+n−1)∗n​=2n2​=O(n2)​
时间复杂度,最好O(n2)O(n^{2})O(n2),最差O(n)O(n)O(n)

二分查找的时间复杂度
int BinarySearch(int* a, int n, int x)  
{  
	assert(a);  
	int begin = 0;  
	int end = n-1;  
	  
	while (begin <= end)  
	{  
		int mid = begin + ((end-begin)>>1);  
		if (a[mid] < x)  
			begin = mid+1;  
		else if (a[mid] > x)  
			end = mid-1;  
		else  
			return mid;  
	}  
	return -1;  
}

最坏情况下,除了多少次2,就查找了多少次
假设查找了x次
2x=N 2^{x}=N 2x=N
x=log⁡2N x=\log_{2}N x=log2​N
最好时间复杂度O(1)O(1)O(1),最坏O(log⁡N)O(\log N)O(logN)

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

有多次调用,0才返回的话,有n+1次调用
每次调用是O(1)O(1)O(1)
合计是累加起来,是O(n)O(n)O(n)

  • 递归算法时间复杂度是多次调用的次数累加
斐波那契递归Fib的时间复杂度
long long Fib(size_t N)  
{  
	if(N < 3)  
		return 1;  
	return Fib(N-1) + Fib(N-2);  
}

是两路递归

2^0       Fib(N)
2^1       Fib(N-1)  Fib(N-2)
2^2       Fib(N-2)  Fib(N-3)  Fib(N-3)  Fib(N-4)
2^3       ...
...       ...
          Fib(3)
2^(N-1)   Fib(2)    Fib(1)

加起来,时间复杂度是O(2n)O(2^{n})O(2n)

空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度
空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定

冒泡排序空间复杂度
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;  
	}  
}

传过来的指针,指向一个数组的空间,不算在内
要算的是额外开辟的空间
有end,exchang,i,3个
所以空间复杂度O(1)O(1)O(1)

斐波那契数列的空间复杂度
// 返回斐波那契数列的前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;  
}

malloc开辟了n+1个空间
空间复杂度就是O(n)O(n)O(n)

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

要一直递归调用,到Fac(0)截止

Fac(N)
Fac(N-1)
Fac(N-2)
Fac(N-3)
...
Fac(1)
Fac(0)

递归调用会在栈帧开空间
每个栈帧是O(1)O(1)O(1)
n个栈帧,空间复杂度就是O(n)O(n)O(n)

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

空间复杂度是O(N)O(N)O(N)
虽然是两路递归,时间是累计的,空间是可以重复利用的
从Fib(N)一直调用到Fib(1),累计建立了N层栈帧
之后栈帧就销毁了,之前的空间还可以重复利用,可以共用空间

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层 本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。 阅读详情

相关推荐

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 413

时间复杂度On和空间复杂度O1是什么意思?

(1)、把输入规模看成x轴,所花时间/空间看成y轴 O(n)就是y=x,y随x的增长而线性增长。也就是成正比,一条斜线。 O(1)就是y=1,是一个常量,不管x怎么变,y不变,一条与x轴平行的线。 (2)、举个简单的例子,要从0加到n,我们会这么写: 1 2 3 4 intsum = 0; for(inti = 0;i<=n;++i) { sum + = i; } 一共算了n次加法,那么就说...

qq_34471241的博客 5428

Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)

本文详细介绍了如何在 Android 项目中集成 espeak-ng,实现中文离线语音播报。通过下载 so 库、编写 Java 接口、封装管理类,开发者可快速构建无需账号的 TTS 功能。文章覆盖从零到一的开发步骤、调试技巧及性能优化,适合中高级 Android 开发者参考。

全栈 3318

01-算法的时间复杂度和空间复杂度-总结

算法的时间复杂度和空间复杂度-总结1 什么是算法1.1 什么是算法1.2 斐波那契数列 : fibonacci number1.3 计算算法的执行时间2. 如何评判一个算法的好坏?2.1 从数学上证明算法的正确性、可读性、健壮性2.2 时间维度, 也就是时间复杂度(time complexity)2.3 空间维度, 也就是空间复杂度(space complexity)3 时间复杂度相关知识3.1 ...

goodswifter 457

新能源充电桩充电枪口标准

建立的标准确保了新能源汽车充电的安全性、兼容性和效率,促进了新能源汽车产业的发展。

网络安全的研究者、新能源行业的追求者 4688

C语言版数字锁相放大器实现指南:从复数运算到嵌入式MCU移植的坑我都帮你踩了

本文详细介绍了C语言实现数字锁相放大器的关键技术,包括复数运算优化、嵌入式MCU移植的实战经验及内存管理策略。针对STM32等资源受限平台,提供了从浮点到定点数转换的优化方案,帮助工程师高效处理微弱信号提取问题。

weixin_30721077的博客 432

时间复杂度和空间复杂度的简单讲解

一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。 把今年很流行,淡淡的基佬紫送给各位看官,原谅绿就算了,怕被打死。 文章最后,举例使用二分查找和斐波那契的递归和迭代方法,分别说明时间和空间复杂度。 时间复杂度: 首先要说的是,时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。 当我们面前有多个算法时,我们可以通过计算时间复杂度,判断出哪一

HaloTrriger的博客 5万+

半导体设备微振动控制:天棚阻尼PID与SIMULINK建模实战

半导体制造设备对微振动的敏感度已进入纳米级,光刻机、量测设备等一旦遭遇超过VC-C振动准则的扰动,便会出现套刻误差或检测误判。主动隔振技术通过传感器、控制器与执行器形成闭环,能有效抑制低频共振,其中天棚阻尼控制因物理概念清晰、鲁棒性强而成为工程首选。结合MATLAB/SIMULINK建模,可在设计阶段完成系统性能边界评估与参数整定,再通过C代码生成与FMU导出实现算法向控制器和跨平台仿真迁移。本文从VC-C指标拆解出发,依次讲解天棚阻尼PID控制原理、两自由度被控对象建模、控制增益估算、仿真验证方法,并给出

weixin_29169505的博客 326

时间、空间复杂度分析--01

分析一个算法指的是确定其执行时所需要使用的资源的量(如时间和内存) 算法大多被设计用来担任处理大量输入的工作,所以算法的效率和复杂度取决于时间和空间复杂度。 时间复杂度就是一个算法在一定输入量下的运行时间。相似的,空间复杂度是在程序运行期间是需要使用的计算机内存的大小。 总的来说,程序所需要的空间取决于以下两个部分: 固定部分:这个因程序的不同i而不同。它包括存储指令、常量、变量和结构化的变量(...

zeroming的博客 268

试读源码在这里下载

试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4302

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

perseverance51博客 1121

01_空间复杂度

空间复杂度的计算 1.常量空间:当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记 作O(1)。例如下面这段程序: void fun1(int n) { int var = 3; } 线性空间:当算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模n成 正比时,空间复杂度记作O(n)。 void fun2(int n) { int[] array = new int[n]; } 二维空间:当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都

weixin_42310008的博客 405

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

视觉人机器视觉的博客 1480

算法时间和空间复杂度分析

原文出自:https://blog.csdn.net/yangwei282367751/article/details/52426911相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。0x01、计算时间复杂度基本步骤1 、找出算法中的基本语句;  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。2、 计算基本语句的执行次数的数量级;  只...

DurianCoder的博客 399

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构与算法01-复杂度分析

数据结构与算法01-复杂度分析1.为什么需要进行复杂度分析?2.大O复杂度表示法3.时间复杂度分析4.几种常见时间复杂度实例分析4.1.O(1)4.2.O(logn),O(nlogn)4.3.O(m+n),O(m*n)5.空间复杂度分析6.最好,最坏情况时间复杂度7.平均情况时间复杂度8.均摊时间复杂度 1.为什么需要进行复杂度分析? 我们可以把代码跑一遍,通过统计监控就能得到算法执行的时间和占用内存大小,为什么还要做时间空间复杂度分析呢?这种分析方法能比我实实在在跑一遍得到的数据更准确吗? 这种评估算法执

fechinchu的博客 345

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

删除有序数组中的重复项。要求空间复杂度O(1),++时间复杂度O(n)

删除有序数组中的重复项。要求空间复杂度O(1),++时间复杂度O(n) 示例+1: 输入:+[1,1,2] 输出:+[1,2] 示例+2: 输入:+[0,0,1,1,1,2,2,3,3,4] 输出:+[0,1,2,3,4] 不啰嗦直接上具体算法代码: -(NSMutableArray *)cancelRepeatWithArr:(NSMutableArray *)arr { NSLog(@"过滤前 arr:%@",arr); if(arr && [arr isKindOfCl

jia12216的专栏 2026

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

1、复杂度分析

1、复杂度分析 1.1 事后统计法 我们把代码跑一遍,通过统计、监控,就能得到算法的执行的时间和占用的内存大小——事后统计法。 局限性: 测试结果非常依赖测试环境 测试结果受数据规模影响很大 因此引入大O时间复杂度表示法 1.2 大O时间复杂度表示法 表示代码执行时间随数据规模增长的趋势,也叫做渐进时间复杂度,简称时间复杂度。 时间复杂度分析 只关注执行循环次数最多的一段...

小胖小的博客 196

#01算法的复杂性

该算法的时间复杂度是O(2n+1) 大O会忽略常数、低阶和系数,最终记作O(n);如果算法的执行时间和数据规模n无关,则是常量阶,记作O(1);指数和阶乘是,其余都是。我们把时间复杂度是非多项式量级的算法问题称为(Non-Deterministic-Polynomial,非确定多项式)问题。上边最理想的情况就是第一个就是要找的,所以最好情况下时间复杂度是O(1)最坏的情况,就是要找的数在最后一个,需要遍历n次,最坏情况下时间复杂度是O(n为了方便说明,我们假设数组中一定存在要找的数。

weixin_73223235的博客 905

3991. 满足条件的01串-AcWing题库

作者 : Xia Xinyu 日期 : 2021-10-02 原题链接 给定一个 01 串,如果同时满足下列两个条件,则输出Yes,否则输出No: 不存在两个相邻的 1 每个 0 两边至少有一个 1 输入格式 第一行包含整数 T,表示共有 T 组测试数据。 每组数据第一行包含整数 n。 第二行包含一个长度为 n 的 01 字符串。 输出格式 每组数据输出一行结果,如果同时满足两个条件,输出 Yes,否则输出 No。 数据范围 前三个测试点满足,1≤n≤100。 所有测试点满足,1≤T≤10,1≤n≤10.

weixin_49959220的博客 241

【霍罗维兹数据结构】数据抽象化 | 时间复杂度 | 性能分析与性能度量

最近在读霍罗维兹的《数据结构基础》(Fundamentals of Data Structures in C),本篇博客为阅读笔记和知识总结。

有道无术, 术尚可求。有术无道, 止于术。 2753

数据结构1:算法复杂度分析

复杂度分析 声明的赋值度: 无 每条赋值的复杂度:1 每条判断的复杂度:1 判断的分支:计算所有情况中复杂度较大者 返回return的复杂度:1 但是注意若一个函数中有多个return ,执行时只执行其中一个,只能算一次。 若返回return中仍有表达式,不算复杂度 float rsum ( float list[ ], int n ) { /* add a list of numbers */ if ( n ) //判断 1 return rsu

HGGshiwo的博客 7315

P2370 yyy2015c01 的 U 盘 (01背包+二分)

一、题目 你找 yyy2015c01 借到了这个高端的 U 盘,拷贝一些重要资料,但是你发现这个 U 盘有一些问题: 这个 U 盘的传输接口很小,只能传输大小不超过LL的文件。 这个 U 盘容量很小,一共只能装不超过SS的文件。 但是你要备份的资料却有很多,你只能备份其中的一部分。 为了选择要备份哪些文件,你给所有文件设置了一个价值V_iVi​,你希望备份的文件总价值不小于pp。 但是很快你发现这是不可能的,因为 yyy2015c01 的传输接口太小了,你只有花钱买一个...

weixin_50836068的博客 344

Day-01-两数之和

查找特性,一边遍历数组,一边把看过的值存入哈希表中。当我们遍历到 nums[i] 时,先看 HashMap 里有没有 target - nums[i]。如果有,说明找到了,直接返回。如果没有,就把当前的 nums[i] 存入 Map,方便后面的数来找它。这是最直观的想法:使用两层 for 循环,外层循环固定一个数,内层循环寻找能与之相加等于 target 的另一个数(列出所有可能寻找和为target的两个数)。暴力法的瓶颈在于:寻找目标差值(target - nums[i])的过程太慢了。

weixin_63098762的博客 458

【算法】【排序算法】【01】冒泡、选择、堆

排序01冒泡经典冒泡冒泡优化1冒泡优化2冒泡排序的复杂度和稳定性选择选择排序的复杂度和稳定性 (1)前期准备参考: 代码环境准备 (2)空间复杂度 & 原地算法 空间复杂度: 算法执行所需要的临时空间 原地算法 in-place: 不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入 空间复杂度为O(1)的可以认为是原地算法 非原地算法,称为 Not-in-place 或者 Out-of-place 开局一张图 冒泡 经典冒泡 public class _01_Bub

weixin_43589563的博客 182

【图的同构识别】算法设计与分析实验2

图的同构识别指导教师姓名重剑DS学号实验日期2022.05.19前言:在Wikipedia(维基百科)上是这么描述同构的:同构是在数学对象之间定义的一类映射,它能揭示出在这些对象的属性或者操作之间存在的关系。若这两个数学结构之间存在同构映射,那么这两个结构叫做是同构的。一般来说,如果忽略掉同构的对象的属性或操作的具体定义,单从结构上讲,同构的对象是完全等价的。使用图论中的术语来描述的话:假设G=(V,E)和G1=(V1,E1)是两个图,如.........

努力学习的DS 3971

Leetcode01:两数之和

链接:https://leetcode-cn.com/problems/two-sum/solution/ 我的提交:暴力解法 class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; for(int i=0 ;i&lt; nums...

Java面试辅导-海龟老师 461
上一篇: 数学规划模型|线性规划|整数规划
下一篇: 多目标规划模型|运输问题|生产组织与计划问题|工厂选址问题|设备购置和安装问题|旅行商问题
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值