001 数据结构_时间复杂度与空间复杂度——“C”

001__嵌入式知识体系+数据结构概念+时间复杂度+顺序表 第一天笔记 一、数据结构概述 - 基本概念 数据结构指的是计算机存储数据和组织数据的方式,存储数据和组织数据的目的是为了后期对数据的再次利用,所以存储的数据一般是具有一个或者多个特定关系的集合,利用不同的数据结构可以提高数据的访问效率。 思考:为什么大家来到新教室选好座位之后需要填写座位表?? 答案:方便对数据管理 数据指的是可以被输入到计算机并且可以被计算机处理的符号的总称,数据的英文是Data。 - 数据结构 数据是有单位的,数据的基本单位是数据元素(Data Element),在计算 阅读详情

一、时间复杂度

(1) 什么是时间复杂度

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

引入

大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
原理:去除对结果影响不大的项

1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶

时间复杂度的最好、平均、最坏情况

在实际中一般情况关注的是算法的最坏运行情况

最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
所以数组中搜索数据时间复杂度为O(N)

二、时间复杂度例题

实例1

时间复杂度为O(N)

void Fanc2(int N)
{
	int count = 0;
	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{
		++count;
	}
	printf("%d\n", count);
}
解析:程序一共被执行了2*N+10次,如果N很大,那么系数和加一个常数则是对结果影响不大的数
去掉系数和加法常数,剩余N

实例2

时间复杂度为O(1)

void Func4(int N)
{
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
		++count;
	}
	printf("%d\n", count);
}
解析:k<一个常数,这个常数有多大,程序就进行多少次,但这个常数影响不大,代表常数次,可忽略不计
在程序里写出来的常数在CPU看来都一样

实例3

时间复杂度为O(N)

long long Fac(size_t N)
{
	if (0 == N)
	{
		return 1;
	}
	return Fac(N - 1) * N;
}
解析:一共有N次递归,程序走了N次

实例4

时间复杂度为O(N^2)次

long long Fac(size_t N)
{
	if (0 == N);
	{
		return 1;
	}
	for (size_t i = 0; i < N; ++i)
	{
		;
	}
	return Fac(N - 1) * N;
}
解析:每一次递归,一次递归有N次循环,第二次递归有N-1次循环....
全部加起来
1*N+1*(N-1)+1*(N-2)+1*(N-3)+...;去掉系数与常数

实例5:冒泡排序法

时间复杂度为O(N^2)


void  Bubble_sort(int arr[], int sz)
{
	int i = 0;
	int j = 0;
	int temp;
	for (i = 0; i < sz - 1; i++)   //i<sz-1   ->从小到大排列,每进行一次冒泡排序法就会先把最大值排到最后,i表示一共进行多少次冒泡排序法
	{
		for (j = 0; j < sz - 1 - i; j++)       //一次冒泡排序法的交换次数
		{
			if (arr[j + 1] < arr[j])   //比较前后元素的大小,反序则交换,有序不变
			{
				temp = arr[j];                //利用赋值达到从小到大排列的效果
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	return 0;
}
解析:假设有N个元素,一次冒泡排序法交换次数为sz-1-i  一共要进行sz-1次冒泡排序法
 即程序要进行(sz-1-i)(sz-1)次

实例6:二分查找法

时间复杂度为logN


int mid_search(int arr[], int k, int sz)  //定义二分查找函数
{
    int left = 0;                //定义数组元素最左侧下标为0
    int right = sz - 1;          //定义数组元素最右侧下标为总数-1
    while (left <= right)        
    {
        int mid = left + (right - left) / 2;  //此表达式是防止int型溢出哦,也是求平均哈
        if (arr[mid] < k)     
        {
            left = mid + 1;   
        }
        else if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else
        {
            return mid;    //找到了,返回下标
        }
    }
    return -1;            //过程全部走完了,没找到,返回-1;
}
解析:
时间复杂度要看最坏的情况,N个值,每找一次缩小一半, 最坏的情况
为N /2/2/2/2..../2=1  即N个数一直二分,二分查找找到最后
剩余两个数,想要查找的值为两个其中的一个数,只剩最后1个数即1
【/2/2/2/2..../2】=2^x
假设找了x次,每找一次除一个2,那么除了x个2 ,  2^x*1=N
 x=log N  即时间复杂度为log N 底数为2

常见的时间复杂度对比O(1) < O(logN) < O(N) < O(N^2)

二、空间复杂度

(1) 什么是空间复杂度

空间复杂度
1.空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时额外占用存储空间大小的量度
2.空间复杂度不是程序占用了多少bytes的空间,空间复杂度算的是变量的个数
注意:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定
空间复杂度与时间复杂度的计算方法相同:
去除对结果影响不大的数
1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶

(2) 引入

函数栈帧是什么

函数栈帧由以下几部分组成:

函数参数:函数在调用时传递的参数值,这些参数通常是存放在栈帧的开始处。
返回地址:指向调用该函数的指令的地址,用于在函数执行完毕后返回到调用者处继续执行。
帧指针(frame pointer):指向当前函数的栈帧的底部,用于在函数内部访问局部变量和参数。
局部变量:函数内部定义的变量,存放在栈帧中,并随着函数的执行而动态分配和释放。
临时变量:函数执行过程中产生的临时变量,通常也存储在栈帧中

在函数调用结束后,栈帧所占用的空间会被销毁,即栈指针会回到之前的位置。这个过程实际上就是将栈顶指针移动到先前的位置,从而释放掉该函数所占用的栈空间。这样做的目的是为了使下一次函数调用可以使用先前被释放的栈空间,从而提高栈空间的利用率。

因此,栈帧空间的销毁本质上就是回收并释放该函数所占用的栈空间

(3) 空间复杂度例题

实例1

斐波那契数列

long long Fib(size_t N)
{
       if (N > 3)
       {
              return 1;
       }
              return Fib(N - 1) + Fib(N - 2);
       
}

解析如下
原理:
在这里插入图片描述
用等比数列求和计算个数约为2N个,时间复杂度是为O(2N)
。
在这里插入图片描述
在这里插入图片描述

先沿着左边一条竖直不断地走,左边Fib2的回归,随之栈帧销毁,再调用右边的Fib1,用同一个栈帧,这样观来,最多会建立0到N-2个栈帧,即N-1个
因此空间复杂度为O(N)

void Func1()
{
       int a = 0;
printf("%p\n", &a);
}
void Func2()
{
       int b = 0;
       printf("%p\n", &b);   //a,b两个变量开到同一个空间,地址是一样的
}
int main()
{
       int a = 0;
       printf("%p\n", &a);  //两个a所在的栈帧不同
       Func1();//调用func1和2相当于公用了同一块空间
       Func2();
}

提出疑问:为什么Func1与Func2的地址相同呢
在这里插入图片描述

在这里插入图片描述

实例2

空间复杂度为O(1)

冒泡排序法

void  Bubble_sort(int arr[], int sz)
{
     int i = 0;
     int j = 0;
     int temp;
     for (i = 0; i < sz - 1; i++)   //i<sz-1   ->从小到大排列,每进行一次冒泡排序法就会先把最大值排到最后,i表示一共进行多少次冒泡排序法
     {
         for (j = 0; j < sz - 1 - i; j++)       //一次冒泡排序法的交换次数
         {
             if (arr[j + 1] < arr[j])   //比较前后元素的大小,反序则交换,有序不变
             {    
                 temp = arr[j];                //利用赋值达到从小到大排列的效果
                 arr[j] = arr[j + 1];           
                 arr[j + 1] = temp;
             }
         }
     }
     return 0;
}
解析:固定数量的额外空间,i,j等变量的数量都是常数个,不是n个,所以空间复杂度为O(1)个
手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码) 本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。 阅读详情

相关推荐

【项目立项管理、项目整合管理】30天通过软考高项-第二天

①项目或阶段的概述;②范围目标、范围的评估标准,证明达到完⼯标准的证据;③质量目标、项目和产品质量的评估标准、相关核实信息和实际里程碑交付日期以及偏差原因;④成本目标,包括可接受的成本区间、实际成本,产⽣任何偏差的原因等;⑤最终产品、服务或成果的确认信息的总结;⑥进度计划目标,包括成果是否实现项目预期效益:如果在项目结束时未能实现效益,则指出效益实现程度并预计未来实现情况;

weixin_42520723的博客 1000

【C语言数据结构(基础篇)】第一站:时间复杂度与空间复杂度

空间复杂度与时间复杂度的概念以及常见题目的讲解

青色_忘川的博客 1949

安捷伦示波器实战指南:从基础操作到精准触发

本文详细介绍了安捷伦示波器的基础操作与高级功能,包括精准触发配置、波形分析和常见问题排查。通过实战技巧和优化建议,帮助工程师快速掌握示波器的核心功能,提升调试效率。特别适合电子工程师和测试技术人员参考使用。

weixin_30839881的博客 135

【C语言数据结构】空间复杂度和时间复杂度(详细分析)

【C语言数据结构】空间复杂度和时间复杂度(详细分析)

weixin_71138261的博客 2049

基于FPGA的示波器设计

ADC 、DAC、FPGA、LCD液晶、示波器

FDL_AQ的博客 1万+

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3038

深入理解时间和空间复杂度

时间复杂度:算法中的`基本语句重复的执行次数 空间复杂度:空间复杂度算的是变量的个数

k666499436的博客 1万+

华为OD机试真题2025双机位C卷 Java&Go 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 393

【C语言入门数据结构】时间复杂度和空间复杂度

数据结构入门时间复杂度和空间复杂度C语言详解

阿伟的博客 1734

OpenClaw(Clawdbot/Moltbot)如何正确的配置浏览器,实现对浏览器的自动化操作功能(浏览器状态为running:false怎么办)

OpenClaw(Clawdbot/Moltbot)浏览器自动化功能无效?🤖 本文详细介绍如何解决这个问题🔧,让你的OpenClaw(Clawdbot/Moltbot)真正具备"睁眼看世界"的能力,支持网页搜索、点击操作和截图等功能 ✅

XiaoqiangClub的博客 8109

Playwright MCP:开启浏览器自动化的新篇章

在当今数字化时代,浏览器自动化技术在众多领域发挥着至关重要的作用,从简单的网页爬取到复杂的自动化测试,再到智能代理与网页的交互等场景,都离不开高效、可靠的浏览器自动化工具。而微软推出的项目,正是在这一领域的一次创新性探索,它为开发者带来了全新的视角和强大的功能支持。本文将深入探讨的概念、架构、代码示例、应用场景、注意事项以及未来发展方向,帮助读者全面了解这一前沿技术。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5266

时间复杂度和空间复杂度【C语言】

时间复杂度和空间复杂度,是用来评估算法的运行效率的,以此评估算法的优劣程度。 不需要特别准确的计算,是一个估算值。 一、时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 二、 三、 ...

weixin_45423515的博客 1610

SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(一)

Paul G. Huray发表在DesignCon2010的提出铜箔表面雪球模型的论文。第一部分说明之前的铜箔表面模型只适用于5GHz以内,超过5GHz后就不再准确。

小孟同学的博客 2172

001-数据结构与算法概述

数据结构(Data Structure)是计算机存储、组织数据的方式。它是数据元素相互之间存在的一种或多种特定关系的集合。数据的逻辑结构:数据元素之间的逻辑关系数据的存储结构:数据在计算机中的存储方式数据的运算:对数据进行的操作算法(Algorithm)是解决特定问题的有限指令序列,是对解题方法的精确描述。数据结构的定义和分类:理解逻辑结构和存储结构的区别算法的特征和要求:掌握算法的五个基本特征复杂度的初步概念:了解时间复杂度和空间复杂度数据结构与算法的关系:认识两者的相互依存关系。

wyl703的博客 1686

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

数据结构刷题--001

设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即把R中的数据序列由(x 0 ,x 1 ,…,x n-1 )变换为(x p ,x p+1 ,…,x n-1 ,x 0 ,x 1 ,…,x p-1 )。要求如下。 (1)给出算法的基本设计思想。 (2)根据设计思想,采用C语言描述算法。 (3)说明所设计算法的时间复杂度和空间复杂度。 ...

weixin_44088659的博客 364

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【算法与数据结构】LeetCode介绍、简单排序算法、数组(笔记一)

最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。

晚安的博客 1145

第一章:基本数据结构

第一章:基本数据结构 #mermaid-svg-i7xcbE72SOeYgkxL .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-i7xcbE72SOeYgkxL .label text{fill:#333}#mermaid-svg-i7xcbE72SOeYgkxL .node rect,#mermaid-svg

Hanjie-chen的博客 9250

【数据结构:C语言版】001:数据结构的重要性--掌握编程的基石

数据结构是编程世界的基石,掌握它们就如同掌握了解决问题的"瑞士军刀"。无论您是初学者还是经验丰富的开发者,持续深入学习和运用各种数据结构,都将为您的编程之路铺就一条通往卓越的道路。在接下来的系列文章中,我们将逐一深入探讨各种常见的数据结构,帮助您构建起坚实的知识体系。

2403_83044722的博客 578

【优选算法必刷100题】第001~002题(双指针算法):移动零、复写零问题求解

因此我们的大体流程分两步:(1)先找到最后一个复写的数;(2)然后从后往前进行复写操作。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1512

算法入门001-递归、查找

Niklaus Wirth: “程序=数据结构+算法”

lovefantasy2010的博客 646

系统掌握数据结构2-算法

数据结构算法介绍,掌握时间复杂度的概念

泥签的博客 500

LeetCode刷题笔记--001.两数之和

题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 分析: 可以内外循环两遍遍历nums数组,若他们的和为目标值target,则返回这两个数的下标索引。(暴力法) 查找一个元素是否存在于数组中最快的方法是,使用哈希表。故可以首先遍历数组n...

Liekkas_Javey的博客 345

从暴力到最优:LeetCode算法时间与空间复杂度优化终极指南 [特殊字符]

在算法学习和面试准备中,掌握如何从暴力解法逐步优化到最优解法是每个程序员必备的核心技能。本文将通过gh_mirrors/leetcode21/leetcode项目中的实战案例,为你揭示算法优化的完整思路和技巧。无论你是初学者还是有经验的开发者,这篇文章都将帮助你系统性地提升算法优化能力。 ## 为什么算法优化如此重要?🎯 算法优化不仅仅是让代码运行更快,更是体现程序员解决问题能力的关键指标。

gitblog_00090的博客 606

《数据结构与算法全面指南:从理论到实践的核心剖析》

数据结构决定程序骨架,算法赋予程序灵魂掌握这组黄金搭档,编写高效优美程序!

2403_90017956的博客 1207

数据结构知识点整理

数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科数据结构数字计算机软件计算机硬件图书目录示例001高等数学s01002数据结构s02003C语言s03线性的数据结构,按照某个特定要求对书目文件进行查询树形的数据结构,一个棋盘可以派生出n个棋局图形的数据结构,多种通行可能(最短路径)0个或多个字符组成的序列(特殊的线性表)eg:s='a1,a2,....,an'特点:整体串的元素要求:必须是字符什么是模式匹配?

weixin_65785690的博客 358

C001:数据结构7-链表(Linked list)

数据结构7-链表(Linked list) 链表是物理存储是离散的,逻辑上是顺序的线性表序列(a linear sequence)。 链表由节点构成,每个节点是单独的对象存在于内存中。 节点(node)=数据域(element:指向对象 )+指针域(link or pointer:指向下一个节点)     单向链表(SinglyLinked List

franktan2010的专栏 590

软件设计师错题整理——数据结构和算法

软件设计师考试历年真题的错题整理——数据结构和算法

SunSachin的博客 788
上一篇: 008 结构体基础与计算结构体大小——“C”
下一篇: 002 数据结构_顺序表的实现过程——“C”
Fan_558
博客等级 码龄4年 771粉丝 113原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan_558

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值