80.【C语言】数据结构之时间复杂度

news2024/10/24 9:23:02

目录

1.数据结构的定义

2.算法的定义

3.算法的效率

1.衡量一个算法的好坏的方法

例题:计算以下代码的循环次数

2.大O的渐进表示法

练习1:求下列代码的时间复杂度

练习2:求下列代码的时间复杂度

练习3:求下列代码的时间复杂度

练习4:求下列代码的时间复杂度

4.总结:计算时间复杂度的方法

5.时间复杂度的排名


1.数据结构的定义

参见63.【C语言】再议结构体(上)

也可以理解为数据在内存中的存储形式(管理数据)

比如说写通讯录可以用静态数组,动态数组和链表形式存储

2.算法的定义

简单的定义:一系列的计算步骤,用来将输入数据转化成输出结果

3.算法的效率

1.衡量一个算法的好坏的方法

两个方面衡量:时间效率(计算时间分复杂度)和空间效率(空间复杂度)

比较时间要在同一个环境下进行(为了控制变量,但在实际情况下难以控制)

-->比较运行次数(和环境无关)

运行次数举例:对于同一组数据,快速排序和冒泡排序的运行次数不同

例题:计算以下代码的循环次数

void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N ; i++)
	{
		for (int j = 0; j < N ; j++)
		{
			count++;
		}
	}

	for (int k = 0; k < 2 * N ; k++)
	{
		count++;
	}

	int M = 10;
	while (M--)
	{
		count++;
	}

	printf("%d\n", count);
}

定义一个函数F(N),其值为循环次数

可得:F(N)=N^2+2N+10

N=10F(N)=130
N=100F(N)=10210
N=1000F(N)=1002010

但实际中计算时间复杂度时,其实并不一定要计算精确的执行次数,而只需要知道大概的执行次数,那么这里使用大O的渐进表示法

比如可以计算量级(N=10的次方),当N较大时(可理解为n \to \infty),影响F(N)的值主要为N^2,因此$F(N) \approx N^2$

对比N^2N^2+2N+10的两张图

2.大O的渐进表示法

大O符号:用于描述函数渐近行为的数学符号,可以用来衡量时间复杂度和空间复杂度

在上述函数中,Func1的时间复杂度为O(N^2),其去掉了对结果影响不大的地方

练习1:求下列代码的时间复杂度

void Func2(int N)
{
	int count = 0;
	for (int k = 0; k < 2 * N ; ++ k)
	{
		count++;
	}

	int M = 10;
	while (M--)
	{
		count++;
	}

	printf("%d\n", count);
}

运行次数n==2N+10

1.取最高阶的式子(去常数)

n \to \infty时,+10对结果影响不大,因此$2N+10 \approx 2N$

2.去系数

因为n \to \infty时,N前面的系数对结果影响也不大(\lim_{n \to \infty} 2N = \lim_{n \to \infty} N = \infty),因此时间复杂度为O(N)

练习2:求下列代码的时间复杂度

void Func3(int N)
{
	int count = 0;
	for (int k = 0; k < 100; ++ k)
	{
		count++;
	}
	printf("%d\n", count);
}

O(100)吗?不是,为O(1),这里的1不是次数,而是指常数次

练习3:求下列代码的时间复杂度

#include <stdio.h>
const char* strchr( const char* str, char character)
{
	while (*str)
	{
		if (*str == character)
			return str;
		str++;
	}
	return str;
}

int main()
{
	char character;
	char str[100] = { 0 };
	scanf("%c", &character);
	scanf("%s", str); // 数组名就是数组的首元素地址
	const char* s_str=strchr(str, character);
	printf("%s", s_str);
}

发现:运算次数和字符串的长度以及和要找的字符位置有关

即该题的时间复杂度存在最好,平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界)

按预期管理来看,应该取最坏的情况,即O(N),N为输入字符串的长度

练习4:求下列代码的时间复杂度

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int n = 0;
	int arr[100] = { 0 };
	int tmp = 0;
 
	//输入元素
	a:printf("输入数组元素个数:");
	scanf("%d", &n);
	if (n > 100 || n < 1)
	{
		printf("输入的元素个数超出范围或无效!请重新输入!\n");
		goto a;
	}
	printf("输入数组元素:");
	for (int k = 0; k < n; k++)
	{
		scanf("%d", &arr[k]);
	}
	//冒泡排序
	for (int i = 1; i <= n - 1; i++)//趟数
	{
		int flag = 1;//每趟排序时置为1
		for (int j = 0; j <= n - i - 1; j++)//步数
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//发生交换flag置0
			}
		}
		if (1 == flag)
		{
			break;//未发生交换则退出循环
		}
	}
 
	//打印结果
	for (int q = 0; q < n; q++)
	{
		printf("%d ", arr[q]);
	}
	return 0;
}

同样的,在冒泡排序(参见42.【C语言】冒泡排序)中,运算次数也有最好和最坏的情况

显然此代码是按升序排列

最好:给的数组就是按升序排列的(如0 1 2 3 4 5 6 7 8 9)

尽管j的for循环中的if判断的交换没有执行(相当于空转),但由于flag一直为0,因此到j为8时才能退出循环

因此运行次数n==N-1-->舍去常数后-->N

因此最好:O(N)

最坏:给的数组就是按降序排列的(如9 8 7 6 5 4 3 2 1 0)

因此因此运行次数n==(N-1)+(N-2)+(N-3)+...+(1)==(1+N-1)*(N-1)/2==(N^2-N)/2

取最高阶的式子0.5N^2,去掉最高阶式子前的系数-->N^2

因此最坏:O(N^2)

4.总结:计算时间复杂度的方法

若次数为常数,时间复杂度为O(1)

若次数为N的表达式

1.取最高阶的式子(去常数) 2.去掉最高阶式子前的系数

若存在最好,最坏情况,取最坏的情况作为时间复杂度

5.时间复杂度的排名

O(1)<O(logN)<O(N)<O(N*logN)<O(N^3)<O(2^N)

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

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

相关文章

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…

SpringBoot项目-Thymeleaf安装

SpringBoot项目-Thymeleaf安装 参考文章:SpringBoot 整合Thymeleaf教程及使用方法 参考视频:模板引擎Thymeleaf快速入门 其实,参考的文章和视频,他们丢失了一些细节,我搞的时候还是有错 第1步:pom.xml增加依赖 <!-- SpringBoot集成thymeleaf模板 --><depe

【数据服务篇】KML卫星波束覆盖数据:区域可视化利器

大纲 1.概述2.文件结构3.覆盖区域详细信息4.应用场景5.使用说明6.数据样例7.结语 1.概述 文件使用 KML&#xff08;Keyhole Markup Language&#xff09;格式&#xff0c;用于展示卫星在特定地区的波束覆盖情况&#xff0c;便于在地理信息系统&#xff08;GIS&#xff09;中进…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 这一期部分介绍借用了网站内容. 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的…

麒麟信安CentOS安全加固案例获评中国信通院第三届“鼎新杯”数字化转型应用奖

“鼎新杯”数字化转型应用大赛&#xff0c;由中国通信标准化协会主办、中国信息通信研究院承办&#xff0c;以落实国家“十四五”规划关于“加快数字化发展&#xff0c;建设数字中国”的总体要求为目标&#xff0c;意在打造一批具有产业引领与推广应用效应的企业数字化转型应用…

深度学习中一些好的博客

pandas中的基本知识 假设我们的pf是一个pandas的结构 pf.column_namedf[‘column_name’]df.loc[:, ‘column_name’]df.iloc[:, column_index] 如果想将 pandas 中的数据转换为 NumPy 格式&#xff0c;你可以使用 .values 或 .to_numpy() 方法。 反向传播 想要有grad&…

安全、专属且高效:WorkPlus即时通讯平台引领高效协作新纪元

在信息和技术迅速发展的现代社会&#xff0c;企业的工作方式正发生深刻的变革。随着全球化和数字化进程的加快&#xff0c;企业所面临的沟通与协调挑战也愈发明显。传统的沟通方式已无法适应快速发展的市场需求&#xff0c;企业迫切需要一种既安全又高效的即时通讯工具&#xf…

Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇

一套UGUI的小框架用一篇文章显然是不够的&#xff0c;因为会很长很长大约有上万字&#xff0c;想必读者也没有那个耐心一点点读完&#xff08;主要是我也懒&#xff09;&#xff0c;所以我就将其分为三个部分 基础分析篇 功能撰写与优化篇 扩展与总结篇 我将其都放在了同一个专…

Opencv之读取图片

目录 安装opencv读取彩色图片显示图片读取灰度图片结论 安装opencv pip install opencv-python读取彩色图片 使用OpenCV库读取彩色图片&#xff0c;其格式默认为BGR。 下面的代码展示了如何读取一张名为bg.jpg的彩色图片&#xff0c;并获取其相关信息。 import cv2# 读取彩…

Brave编译指南2024 Linux篇-构建与运行(七)

引言 在完成了构建环境的初始化后&#xff0c;我们终于可以开始编译Brave浏览器了。本文将详细介绍如何构建Brave浏览器&#xff0c;以及如何运行编译好的浏览器。 1.编译Brave浏览器 1.1 构建 使用下面的命令进行发布构建 npm run build 这个命令会触发一系列的编译过程…

【pyspark学习从入门到精通5】弹性分布式数据集_3

目录 Actions .take(...) 方法 .collect(...) 方法 .reduce(...) 方法 .count(...) 方法 .saveAsTextFile(...) 方法 .foreach(...) 方法 Actions 与转换不同&#xff0c;动作是在数据集上执行计划任务的&#xff1b;一旦您完成了数据的转换&#xff0c;就可以执行您的转…

数学科普读物《从毕达哥拉斯到怀尔斯》

毕达哥拉斯是古希腊数学家&#xff0c;怀尔斯是英国数学家&#xff0c;曾任美国普林斯顿大学教授。这本书是哈工大出版社刘培杰先生主编的。这是一本500多页的书&#xff0c;我不禁慨叹高级数学爱好者刘培杰的博学广识&#xff0c;因为书中纵论古今旁征博引&#xff0c;仅书后的…

JavaWeb 18.监听器

目录 一、监听器概述 监听器的分类 按监听的对象划分 按监听的事件划分 二、监听器的六个主要接口 1.application监听器 2.session域监听器 3.request域监听器 三、session域的两个特殊监听器 1.session绑定监听器 2.钝化活化监听器 什么是钝化活化 如何配置钝化与活化 ​编辑 …

高并发下的库存扣减技术

背景 针对库存操作&#xff0c;宗旨&#xff1a;绝不超卖&#xff08;存在资损、造成客诉、用户体验差&#xff09;、尽量避免少卖&#xff08;相对资损&#xff09;。 在明星直播、大促、秒杀等高并发场景下&#xff0c;数据库的性能会变得非常差&#xff0c;传统的分库分表…

【C++进阶专栏】:priority_queue(优先级队列)?仿函数?

文章目录 前言1、优先级队列的使用&#xff1f;2、仿函数&#xff1f;3、优先级队列用仿函数实现大/小堆变换&#xff1f; 前言 priority_queue&#xff1a;优先级队列&#xff0c;别看有一个队列的名字&#xff0c;但结构个队列完全不一样。队列是一种先进先出的结构特征&…

AttributeError: ‘str‘ Object Has No Attribute ‘x‘:字符串对象没有属性x的完美解决方法

AttributeError: str Object Has No Attribute x&#xff1a;字符串对象没有属性x的完美解决方法 &#x1f50d;&#x1f4a1; AttributeError: str Object Has No Attribute x&#xff1a;字符串对象没有属性x的完美解决方法 &#x1f50d;&#x1f4a1;摘要 &#x1f4d6;引言…

四、音频播放

一、相关逻辑 在登录代码中调用&#xff0c;资源加载代码&#xff0c;然后再资源加载代码中调用。 1、登陆方法中&#xff1a; 单例类音频调用自己的方法&#xff0c;然后传入配置代码中的常量 2、音频播放代码中&#xff1a; 首先设置为一个单例类&#xff0c;然后初始化一…

精益与数字化的融合:制造业的创新之路

回望过去&#xff0c;精益管理作为制造业的瑰宝&#xff0c;以其“消除浪费、持续改进、顾客至上”的核心理念&#xff0c;引领了无数企业走向成功。从丰田生产方式到全球范围内的广泛实践&#xff0c;精益管理不仅提升了生产效率&#xff0c;更重塑了企业的文化和价值观。它教…

【Python大语言模型系列】一文教你使用dify云版本开发一个简单的Agent(完整教程)

这是我的第365篇原创文章。 一、引言 智能助手&#xff08;Agent&#xff09;&#xff0c;利用大语言模型的推理能力&#xff0c;能够自主对复杂的人类任务进行目标规划、任务拆解、工具调用、过程迭代&#xff0c;并在没有人类干预的情况下完成任务。 本文我们将搭建一个旅行…

vt虚拟化怎么开启_各品牌主板及品牌机开启VT虚拟化教程

VT指的是CPU的虚拟化技术可以单CPU模拟多CPU并行&#xff0c;允许一个平台同时运行多个操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提高计算机的工作效率。下面&#xff0c;小编给大家介绍电脑开启vt的操作步骤。 VT虚…