[数据结构-C语言] 算法的时间复杂度

news2024/10/5 2:48:07

目录

1.算法的复杂度

2.时间复杂度

2.1 时间复杂度的概念

2.2 大O的渐进表示法

3、常见时间复杂度计算举例

3.1 冒泡排序

3.2 二分查找

3.3 阶乘递归

3.4 斐波那契数列


1.算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算
机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计
算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度 。

2.时间复杂度

2.1 时间复杂度的概念

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

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

举例:
Q:计算一下Func1中++count语句执行了多少次?

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);
}

Func1 的时间复杂度:F(N) = N*N + 2*N + 10

N = 10 F(N) = 130

N = 100 F(N) = 10210

N = 1000 F(N) = 1002010

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

2.2 大O的渐进表示法

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

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

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

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。

注:时间复杂度是不固定的,时间复杂度表示的是最坏的情况。
举例:

Q:计算下面代码的时间复杂度

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

A:时间复杂度:O(M+N)

分析:
这里除非说明过 M >> N 或 N >> M ,远小于的那个字母就可以不表示。

Q:计算下面代码的时间复杂度

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

A:时间复杂度:O(1)。

分析:这里的1不是一次,是代表常数次,常数次用 O(1) 表示,写为一亿也是常数。

3、常见时间复杂度计算举例

3.1 冒泡排序

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;
	}
}

分析:

因此,冒泡排序的时间复杂度:O(N^2)。

3.2 二分查找

int BinarySearch(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;
	// [begin, end]:begin和end是左闭右闭区间,因此有=号
	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;
}

分析:

因此,二分查找的时间复杂度:O(log N)。

3.3 阶乘递归

long long Fac(size_t N)
{
	if (0 == N)
		return 1;
	return Fac(N - 1) * N;
}

分析:

因此,递归阶乘的时间复杂度:O(N)。

总结:在递归调用的时候,函数内部的时间复杂度为 O(1),递归后的整体时间复杂度就是递归的次数。函数内部的时间复杂度为O(N),递归后的整体时间复杂度为O(N*M)。这里的M是次数。

3.4 斐波那契数列

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

分析:

因此,斐波那契数列的时间复杂度:O(2^N)。

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

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

相关文章

PS学习记录——自动选择的【图层】/【组】模式说明

PS中&#xff0c;【移动工具】状态下&#xff0c;上方的工具栏有个【自动选择功能】&#xff0c;用于移动图像 自动选择下有【图层】、【组】两种选项 1、自动选择-【图层】 图层模式下&#xff0c;自动选择可以任意移动选中的图像图层&#xff0c;想移动哪个就移动哪个 即便不…

43.CSS grid布局

本节我们学习的初始代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" …

110页智慧农业解决方案(农业信息化解决方案)(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 第一部分 智慧农业概述 智慧农业以农业资源为基础、市场为导向、效益为中心、产业化为抓手&#xff0c;面向农业管理部门、农技推广部门、农业企业、农业园区和基地、农业专家…

【C】Pointer

系列连载 【python / C / C】 参考 《C语言程序设计&#xff08;第四版&#xff09;谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录一、指针的重要性二、指针的定义三、指针的分类基本类型指针指针和一维数组指针和函数指针和结构体多级指针int * p;// p …

CASS自带数据-绘制地形图

1、打开cass软件&#xff0c;如下图&#xff1a; 2、点击“绘图处理”菜单栏&#xff0c;选择“展野外测点点号”&#xff0c;如下&#xff1a; 3、在命令栏输入绘图比例尺&#xff0c;这里选择默认1:500&#xff0c;点击回车键进入下一步&#xff0c; 4、在弹出的窗口中&#…

单片机通过串口向电脑端发送数据电脑端发送数据控制led

上节课我们学习了串口的理论部分&#xff0c;这节课我们要来学习实操部分。 要想实现单片机通过串口向电脑端发送数据&#xff0c;我们首先要来配置寄存器。 1.配置SCON SCON寄存器中的SM0配置为0&#xff0c;SM1配置为1决定了串口工作在模式一&#xff0c;也就是8位UART&am…

前端透明分栏设计

目前在开发一个基于众包的打分网站&#xff0c;前端遇到的一个需求是&#xff1a; 背景是电影的海报&#xff0c;且不能随着scroll-bar滚动&#xff0c;需要一个蒙版分为两栏&#xff0c;左侧是影视的媒体信息&#xff0c;不随页面滚动右侧是影视的基本信息和评分信息&#xf…

如何使用基于GPT-4的Cursor编辑器提升开发效率

程序员最恨两件事情&#xff1a;一是别人代码不写文档&#xff0c;二是要让自己写文档。随着 GPT-4 的到来这些都不是问题了&#xff0c;顺带可能连程序员都解决了。。。 之前一直觉得 AI 生成的代码也就写个面试题的水平&#xff0c;小打小闹&#xff0c;现在时代可变了。Curs…

@Conditional四个较常用的派生注解总结

该内容是在学习SpringBoot底层的时候&#xff0c;看到SpringBoot的使用&#xff0c;所以这的做一个简单的总结方便以后复习。可能会有一些问题&#xff0c;还望指出共同学习 Conditional注解&#xff1a; 作用&#xff1a;按照一定的条件进行判断&#xff0c;在满足给定条件后…

如果采用密钥对的形式登录系统后,如何由普通用户切换到root用户

使用xshell工具 采用秘钥的方式进行登录 创建一个新用户并设置密码 切换到新用户之后 su root 想要切换成root用户的时候 输入密码提示 su:Authentication failure su&#xff1a;身份验证失败 使用秘钥之后是不能使用密码再进行登录 我去阿里云查了一下 有一个相同…

stable diffusion 安装xFormers 报错:Couldn‘t install open_clip.

一、No module ‘xformers’. Proceeding without it. 这是因为没有安装xformers导致的。 解决办法&#xff1a; 在webui-user.bat文件这添加一行&#xff1a; set COMMANDLINE_ARGS--xformers如下图所示&#xff1a; 试着点击webui-user.bat&#xff0c;看能否下载&#xff…

17:00面试,17:04就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…

你具备抽离与封装的思想吗?

笔者最近思考了自己参与的分布式系统业务的架构小细节&#xff0c;虽然笔者每天做的是实现部分需求与业务&#xff0c;但是笔者还是拥有很多时间去读底层源码的&#xff0c;加之笔者自身的思考与实践demo的总结&#xff0c;笔者将在本篇文章中提出笔者自己对“抽离”与“封装”…

Nginx编译安装及配置文件详解

写在前面 Centos版本&#xff1a;Centos 7.6 - 64bit Nginx版本&#xff1a;1.20.2 一、什么是Nginx Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 二、Nginx用在哪些地方 2.1 静态资源服务 动静…

mkv视频文件怎么转成mp4,这3个方法很好用

对于那些电脑不是很精通的小伙伴来说&#xff0c; mkv视频文件怎么转成mp4&#xff1f;小编先来介绍一下mkv视频格式&#xff0c;mkv是一种开放标准的自由的容器和文件格式&#xff0c;是一种多媒体封装格式&#xff0c;能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨…

MVCC底层原理

目录说明MVCC的底层原理隐藏字段undo logRead View说明 在被面试官问面试题的时候&#xff0c;首先它问了Mysql的事务的隔离级别有几种&#xff1f;默认是哪种&#xff1f;他们分别解决了什么问题&#xff1f; 我在一顿回答“巴巴巴巴。。。。”之后&#xff0c;它又继续问题…

追踪项目进展常用的衡量方法

作为项目管理活动&#xff0c;项目中的进度跟踪可以帮助你了解项目实时的完成状态。有了正确的方法、项目管理工具和指标&#xff0c;项目跟踪可以指导你的团队的行动&#xff0c;甚至在问题出现之前向你发出预警。 项目经理使用各种方法、工具和指标来跟踪进度。其中最常见的…

自然语言处理(Natural Language Processing,NLP)简要

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;简要一、发展状况二、发展优势三、发展瓶颈四、具体研究方向五、自然语言处理工具六、未来发展方向自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机…

(原创)Flutter基础入门:各种常用容器类组件

前言 上篇博客主要讲了Flutter的Shape实现 Flutter基础入门&#xff1a;实现各种Shape效果 今天主要讲下Flutter中常用的一些容器组件 Flutter中组件数量很多&#xff0c;分类方式也各有不同 比如可以分为有态组价和无态组件 又可以分为容器组件、功能组件等 拿功能组件来说 有…

docker网络详解,自定义docker网络

文章目录一、初识docker网络1、docker0虚拟网桥2、docker网络常用基本命令3、docker网络可以解决的问题二、docker网络模式1、四种网络模式2、容器实例内默认网络IP生产规则3、bridge模式4、host模式5、none模式6、container模式五、自定义网络模式1、过时的docker link2、使用…