数据结构之一:复杂度

相关代码:SData/test_22/main.c · Hera_Yc/bit_C_学习 - 码云 - 开源中国

数据结构:在内存当中存储、组织数据的方式。(顺序表、链表、栈、队列、树等)。

算法:与数据结构配合使用,是对数据的处理。(查找、排序、二分查找、动态规划等)。

复杂度:用来分析算法的性能,算法的性能分为时间开销和空间占用两个部分。

        现代计算机,对空间复杂度的要求很低了。根据摩尔定律,现代计算机的内存已经是相当大的,对于几个字节的额外开销,这些空间复杂度可以忽略不计了。(1GB大约可以定义2千5百万个int)。


时间复杂度

        算法的时间复杂度是一个函数,它描述了该算法的运行时间。从理论上讲,执行一段算法所消耗的时间是不可计算的。因此:

时间复杂度:描述算法中基本操作的执行次数

大O渐进表示法

void Func(int N)
{
	int count = 0;
	int i = 0;
	int j = 0;
	for (i=0; i < N; i++)
	{
		for (j=0; j < N; j++)
		{
			count++;
		}
	}
	int M = 10;
	while (M--)
	{
		count++;
	}
	printf("%d\n", count);
	return;
}
//F(N)=N*N+2*N+10
//用大O的渐进表示法表示
//O(N)=N*N

        实际计算中,我们并不一定要精确的计算,只需要大致的执行次数,因此我们这里使用大O渐进表示法

推导大O阶方法:

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行函数中,只保留最高项。
  3. 如果最高项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶。
  4. 可以根据算法的名称推算时间复杂度。(从算法思想上计算)。

对于一些算法,它们的时间复杂度不是固定的,存在最好和最坏的两种情况:

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

实例

1、O(M+N)

int Func2(int N, int M)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < N; i++)
	{
		count++;
	}
	for (i = 0; i < M; i++)
	{
		count++;
	}
	return 0;
}
//O(M+N)

2、 O(1)

void Func3(int N)
{
	int k = 0;
	int count = 0;
	for (k = 0; k < 100; k++)
	{
		count++;
	}
}
O(1)

 3、冒泡排序的时间复杂度

//冒泡排序
//时间复杂度O(N^2)
//最好情况是O(N)
#include <assert.h>
void BubbleSort(int a[],int n)
{
	assert(a);
	size_t end = 0;
	for (end = n; end > 0; end--)
	{
		int exchange = 0;
		size_t i = 1;
		for (i = 1; i < end; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}
		if (exchange = 0)
			break;
	}

}

 4、二分查找的时间复杂度

int BinSearch(int* arr,int sz,int oj)
{
	int left = 0;
	int right = sz - 1;
	int mid = 0;
	while (left < right)
	{
		mid = left + (right - left) / 2;
		if (arr[mid] < oj)
		{
			left = mid + 1;
		}
		if (arr[mid] > oj)
		{
			right = mid - 1;
		}
		if (arr[mid] == oj)
		{
			return arr[mid];
		}
	}
	return -1;
}

 根据二分查找的算法逻辑来推算时间复杂度:

  • 最好的情况:一次找到,O(1)
  • 最坏的情况:最后一次找到:log2(N)
  • 时间复杂度:O(log2(N))

5、递归函数(初步认识、后面补充)

//求阶乘
//O(N)
//递归算法如何计算:递归次数*每次递归函数的次数
long long Fac(size_t N)
{
	return N < 2 ? N : Fac(N - 1) * N;
}

6、斐波那契()


空间复杂度

空间复杂度:计算的是定义的变量个数,包括调用其他函数的栈帧

空间复杂度的计算与时间复杂度类似:

  1. 用常数1取代运行时间中的所有加法常数。
  2. 每定义一个变量,空间复杂度+1。
  3. 每调用一次其他函数,开辟一个新的栈帧,有额外的空间复杂度。
  4. 函数的形式参数也算空间复杂度的一部分。

时间复杂度不计算时间,计算的是大概的运算次数。

空间复杂度不计算空间,计算的是大概定义的变量个数。

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

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

相关文章

【鸿蒙技术分享:探索 HarmonyOS 开发之旅】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Houdini和Blender如何使用CPU云渲染

近期&#xff0c;渲染101云渲染农场在产品和服务方面进行了重要更新&#xff0c;进一步提升了我们平台的渲染能力和兼容性&#xff0c;助力各位用户高效完成创作。云渲码6666 渲染101云渲码6666 1. Houdini和Blender支持CPU云渲染 我们不断拓展云渲染的工具和平台支持&#x…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js &#xff08;放在项目根目录下&#xff09; module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

网络编程 作业1

1.c #include <myhead.h> #define IP "192.168.60.45" #define PORT 6666 #define BACKLOG 100 void fun(int sss) {if(sssSIGCHLD){while(waitpid(-1,NULL,0)>0);}} int main(int argc, const char *argv[]) {//1.捕获子进程退出时的信号if(signal(SIGCHL…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

外排序中的归并排序

外排序中的归并排序 7.11 外排序中的归并排序相关基础知识原理最终参考程序 7.11 外排序中的归并排序 外部排序&#xff1a;数据元素太多不能同时放在内存中&#xff0c;根据排序过程的要求不能在内外存之间移动数据的排序。&#xff08;下文也称外排序&#xff09; 例如 1 G…

wsl2中kali linux下的docker使用教程(教程总结)

一、前言 上一篇关于kali linux的文章是图形界面的配置&#xff0c;这里作者准备补充两点&#xff0c;一点是在使用VNC时&#xff0c;如果F8不能用的话&#xff0c;可以试试AltF8&#xff1b;然后就是VNC在初始化设置时的三个设置选项依次是密码、再输一次以及设置仅观看密码。…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO&#xff08;证据下界&#xff09;——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节&#xff1a;ELBO的类比与核心概念【尽可能通俗】 ELBO&#xff0c;即证据下界&#xff0c;在…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体&#xff08;entity&#xff09;类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统&#xff0c;实现用户数据的CRUD。 打开navicat16&#xff0c;…

堆外内存泄露排查经历

优质博文&#xff1a;IT-BLOG-CN 一、问题描述 淘宝后台应用从今年某个时间开始docker oom的量突然变多&#xff0c;确定为堆外内存泄露。 后面继续按照上一篇对外内存分析方法的进行排查(jemalloc、pmap、mallocpmap/mapsNMTjstackgdb)&#xff0c;但都没有定位到问题。至于…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

Vue3 源码解析(三):静态提升

什么是静态提升 Vue3 尚未发布正式版本前&#xff0c;尤大在一次关于 Vue3 的分享中提及了静态提升&#xff0c;当时笔者就对这个亮点产生了好奇&#xff0c;所以在源码阅读时&#xff0c;静态提升也是笔者的一个重点阅读点。 那么什么是静态提升呢&#xff1f;当 Vue 的编译器…

C++优选算法十四 优先级队列(堆)

C 中的优先级队列&#xff08;Priority Queue&#xff09;是一种容器适配器&#xff0c;它提供队列的功能&#xff0c;但元素不是按照插入的顺序被访问&#xff0c;而是根据它们的优先级被访问。默认情况下&#xff0c;优先级队列是一个最大堆&#xff08;Max-Heap&#xff09;…

综合练习--轮播图

本篇博客将教大家实现一个基础的轮播图。 源代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体

作者&#xff5c;郭源 前言 在后LLM时代&#xff0c;随着大语言模型和多模态大模型技术的日益成熟&#xff0c;AI技术的实际应用及其社会价值愈发受到重视。AI智能体&#xff08;AI Agent&#xff09;技术通过集成行为规划、记忆存储、工具调用等机制&#xff0c;为大模型装上…

光伏电站的智慧施工详解

光伏电站的智慧施工是利用先进的技术和管理方法&#xff0c;提高施工效率、质量和安全性&#xff0c;降低成本&#xff0c;实现光伏电站建设的智能化、数字化和绿色化。 下面从鹧鸪云智慧施工软件详细施工管理的步骤说起。 项目总览 包含我负责的项目、我参与的项目、我创建…