算法的空间复杂度(C语言)

1.空间复杂度的定义

算法在临时占用储存空间大小的量度(就是完成这个算法所额外开辟的空间),空间复杂度也使用大O渐进表示法来表示

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

例1:

int* fib(int n)
{
	int* fibarray = (int*)malloc(sizeof(int) * (n));
	if (n == 0)
	{
		return NULL;
	}
	fibarray[0] = 1;
	fibarray[1] = 1;
	for (int i = 2; i < n; i++)
	{
		fibarray[i] = fibarray[i - 1] + fibarray[i - 2];
	}
	return fibarray;

}

怎么查看这段代码的空间复杂度:可以观察到该段代码为了完成这个算法额外申请了n个空间,即空间复杂度:O(n)

例2:

void Bubble_Sort(int a[], int n)
{
	assert(a);
	int exchange = 0;
	for (int end = n; end > 1; --end)
	{
		for (int begin = 1; begin < end; ++begin)
		{
			if (a[begin] < a[begin - 1])
			{
				Swap(&a[begin], &a[begin - 1]);
				exchange = 1;
			}
		}
		if (!exchange)
		{
			break;
		}
	}
}

可以观察到这段代码完成这个算法额外开辟了三个空间 即空间复杂度:O(1)

例3:

int fac(int N)
{
    if(N == 0)
    {
       return 1;
    }
    return fac(N-1)*N;
}

这段递归的空间复杂度为多少了

注:每次递归都是开辟新的空间来进行操作

这段代码从Fac(N) 开始 Fac(N - 1),Fac(N - 2).....Fac(1),Fac(0),所以递归了N次

该算法完成递归额外开辟了N个空间:O(N)

我们来看一段代码

void F1()
{
    int b = 0;
    printf("%p ", &b);
}

void F2()
{
    int a = 0;
    printf("%p ", &a);
}

int main()
{
    F1();
    F2();
    return 0;
}

F1和F2是否使用的同一个空间

运行结果:

可以看到这两个不同函数中的变量居然是用的同一个地址

原因:因为mian函数中是先调用的F1,在F1执行完之后,F1所在的空间被系统收回了,即在执行F2时,F2也是用的这个地址,因此F2和F1所用的空间相同

例4:

long long Fib(int N)
{
	if (N < 3)
	{
		return 1;
	}
	return Fib(N - 1) + Fib(N - 2);
}

这段代码的时间复杂度为:O(2^N)

递归时Fib(N) ——> Fib(N - 1) 和 Fib(N - 2),然后编译器是先将Fib(N - 1)先递归完再进行Fib(N - 2)

递归到最后Fib(2) Fib(1)时先执行的是Fib(2),随后就是Fib(1),所以可以推断Fib(1)所用的空间是Fib(2)所释放的空间,所以Fib(1)和Fib(2)所用的空间是一样的所以跟着这个思路往上推,假如N = 5    Fib(5)就额外开辟了4个空间

如图:

一共额外开辟了4个空间

这段代码的时间复杂度;O(2^N)   时间一去不复返,这次不可能执行上一次的操作,不可重复利用

空间复杂度:O(N)    空间用了之后归还,可以重复利用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《C语言》预处理

文章目录 一、预定义符号二、#define定义常量三、#define定义宏四、宏更函数的对比五、#和##1、#运算符2、##运算符 一、预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;在预处理期间进行处理的。 __FILE__//进行编译的源文件 __LINE__//文件当前的…

【Qt】Qt概述

目录 一. 什么是Qt 二. Qt的优势 三. Qt的应用场景 四. Qt行业发展方向 一. 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;为应用程序开发者提供了建立艺术级图形界面所需的所有功能。 Qt是完全面向对象的&#xff0c;很容易扩展&#xff0c;同时Qt为开发…

自动控制:前馈控制

自动控制&#xff1a;前馈控制 前馈控制是一种在控制系统中通过预先计算和调整输入来应对已知扰动或变化的方法。相比于反馈控制&#xff0c;前馈控制能够更快速地响应系统的变化&#xff0c;因为它不依赖于系统输出的反馈信号。前馈控制的应用在工业过程中尤为广泛&#xff0…

Visual studio下使用 Wix 打包 C#/WPF 程序的中文安装包

Visual studio下使用 Wix 打包 C#/WPF 程序的中文安装包 1 下载并安装 Wix Toolset1.1 下载WIX Toolset1.2 安装1.3 配置系统环境变量path1.4 找不到 WiX 工具 candle.exe2 安装Visual studio 20202,并安装插件2.1 下载并安装 Visual Studio2.2 步骤二:安装 Wix v3 扩展插件3 …

人脸识别打卡系统一站式开发【基于Pyqt5的C/S架构】

人脸识别打卡系统 1、运用场景 课堂签到,上班打卡,进出门身份验证。 2、功能架构 人脸录入,打卡签到,声音提醒,打卡信息导出: 3、技术栈 python3.8,sqlite3,opencv,face_recognition,PyQt5,csv 第三方库: asgiref==3.8.1 click==8.1.7 colorama==0.4.6 co…

【TB作品】51单片机 Proteus仿真 00001仿真实物PID电机调速系统

实验报告&#xff1a;Proteus 仿真 PID 电机调速系统 一、实验背景 PID&#xff08;比例-积分-微分&#xff09;控制器广泛应用于工业控制系统中&#xff0c;用于调节各种物理变量。本实验的目的是通过 Proteus 仿真软件设计并实现一个 PID 电机调速系统&#xff0c;以控制直…

Flutter-实现悬浮分组列表

在本篇博客中&#xff0c;我们将介绍如何使用 Flutter 实现一个带有分组列表的应用程序。我们将通过 CustomScrollView 和 Sliver 组件来实现该功能。 需求 我们需要实现一个分组列表&#xff0c;分组包含固定的标题和若干个列表项。具体分组如下&#xff1a; 水果动物职业菜…

C++、QT

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端&#xff1a; 1、【产品中心】产品案列、新闻动态的发布&#xff1b; 2、【员工管理】新增、修改、删除、搜索功能&#xff1b;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

STMF4学习笔记RTC(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

入门PHP就来我这(高级)11 ~ MySQL

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP操作MySQL数据库的方法 PHP操作数据库现在用的多的是mysqli拓展库&#xff0c;mysqli扩…

用HttpURLConnection复现http响应码405

目录 使用GET方法&#xff0c;访问GET接口&#xff0c;服务端返回405使用GET方法&#xff0c;访问POST接口&#xff0c;服务端返回405使用POST方法&#xff0c;访问GET接口&#xff0c;服务端返回405 使用GET方法&#xff0c;访问GET接口&#xff0c;服务端返回405 发生场景&a…

SSRF靶场通关合集

目录 前言 SSRF总结 1.pikachu 1.1SSRF(curl) 1.1.1http协议 1.1.2 file协议查看本地文件 1.1.3 dict协议扫描内网主机开放端口 1.2 SSRF&#xff08;file_get_content&#xff09; 1.2.1 file读取本地文件 1.2.2 php://filter/读php源代码 2.DoraBox靶场 前言 最近…

C++第一弹 -- C++基础语法上(命名空间 输入输出 缺省参数 函数重载 引用)

目录 前言一. C关键字(C98)二. 命名空间1.命名空间的定义2.命名空间的使用3.其它部分 三. C输入&输出四. 缺省参数1. 缺省参数的概念2.缺省参数的分类 五. 函数重载1.函数重载的概念2. 为什么C支持函数重载, 而C语言不支持重载呢? 六. 引用1.引用的概念2.引用的特性3.常引…

sqlite 数据库 介绍

文章目录 前言一、什么是 SQLite &#xff1f;二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

数学建模算法目标规划

在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支—数学规划&#xff0c;而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。特别是在计算机能处理成千上万个…

第二届网络、通信与智能计算国际会议(NCIC 2024)

随着科技的飞速发展&#xff0c;网络通信与智能计算领域正迎来前所未有的变革。在这样的背景下&#xff0c;网络、通信与智能计算国际会议&#xff08;NCIC 2024&#xff09;将于2024年11月22日至25日在中国北京隆重召开。本次大会汇聚了国际学术界的顶尖专家和行业精英&#x…

目标检测算法简述

招聘信息共享社群https://bbs.csdn.net/forums/f6512aad40c7444c8252754ce2dbb427 目标检测算法是一种计算机视觉技术&#xff0c;用于识别图像或视频中的特定对象&#xff0c;并确定这些对象在场景中的精确位置。这些算法通常结合了分类和定位的功能&#xff0c;能够输出每个…

算法系列--分治排序|归并排序|逆序对的求解

一.基本概念与实现 归并排序(mergeSort)也是基于分治思想的一种排序方式,思路如下: 分解:根据中间下标mid将数组分解为两部分解决:不断执行上述分解过程,当分解到只有一个元素时,停止分解,此时就是有序的合并:合并两个有序的子区间,所有子区间合并的结果就是原问题的解 归并…

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

SCI一区TOP|准随机分形搜索算法(QRFS)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;LA Beltran受到分形几何、低差异序列启发&#xff0c;提出了准随机分形搜索算法&#xff08;Quasi-random Fractal Search, QRFS&#xff09;。 2.算法原理 2.1算法思…