时间复杂度与空间复杂度

我们知道算法的效率分为时间效率和空间效率,接下来我们就对这两者进行讨论。

一.时间复杂度.

又被称为时间效率,主要反映一个算法的运行速度。

定义:计算机算法中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,一个算法所发挥的时间与其中语句的执行次数成正比,算法中的基本操作的执行次数为算法的时间复杂度

下面我们就通过具体实例来慢慢学会它!

例一:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
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);

}
int main()
{
	int N = 0;
	scanf("%d", &N);
	Func1(N);
	return 0;
}

看这个代码,问题来了,请问它一共循环多少次?

结果为:N*N+N*2+10

接下来我们就可以看看时间复杂度了。

首先,时间复杂度是一个估算,是看表达式中对其影响最大的一项(当N趋近无穷大

时),所以对于上面这个表达式,N*N对时间复杂度影响最大,就取它。

接下来我们用大O渐进法来表示:

对于上表达式:O(N^2)

understand?

推导大O阶方法:

1、用常数1取代运行时间中的所有加法常数

2、在修改后的运行次数函数中,只保留最高阶项

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^2)

接下来我们一题来分析上述情况:

例二:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
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);

}
int main()
{
	int N = 0;
	scanf("%d", &N);
	Func2(N);
	return 0;
}

求其时间复杂度:

首先循环次数:2*N+10

时间复杂度为:O(N)-----对于上面规律三的运用

例三:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Func3(int N,int M)
{
	int count = 0;
	for (int i = 0; i < N; i++)
	{
		count++;
	}
	for (int j = 0; j < M; j++)
	{
		count++;
	}
	printf("%d\n", count);
}
int main()
{
	int N = 0;
	int M = 0;
	scanf("%d %d", &N,&M);
	Func3(N,M);
	return 0;
}

求其时间复杂度?

循环次数:M+N

时间复杂度:我们发现这题要分类讨论

1.当M与N大小差不对时,O(M)  ,O(N)都行

2.当M远大于N时,O(M)

3.当N远大于M时,O(N)

例四:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Func3(int N)
{
	int count = 0;
	for (int i = 0; i < 100; i++)
	{
		count++;
	}
	
	printf("%d\n", count);
}
int main()
{
	int N = 0;
	
	scanf("%d %d", &N);
	Func3(N);
	return 0;
}

求其时间复杂度:

循环次数:100

时间复杂度:O(1)

常数1取代运行时间中的所有加法常数

满足公式1

例五:

const char* Func5(char* a, char b)
{
	while (*a != '\0')
	{
		if (*a == b)
		{
			return a;
			a++;
		}

	}
	return NULL;
}

求时间复杂度?

有些算法的时间复杂度存在最好、平均和最坏情况:

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

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

最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x

最好情况:1次找到
最坏情况: N次找到
平均情况: N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

对于这题,同理;由于不知道会循环多少次,所以我们按最坏情况来写,即O(N)

例六:

void Bubblesort(int* a, int n)
{
	
	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < n-1 - i; j++)
		{
			if (*(a + j) > *(a + j + 1))
			{
				int tmp = *(a + j);
				*(a + j) = *(a + j + 1);
				*(a + j + 1) = tmp;
			}
		}
	}
}

求其时间复杂度?

循环次数:第一趟:N-1

                  第二趟:N-2

                  ……

                  第N-1趟:1

所以总共:     ( N*(N+N-1))/2

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

例七:

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

求时间复杂度?

循环次数:

对于该题又要分情况讨论了

1,可能一次就可以-----最好情况O(1)

2.最坏情况:

要X次:2^X=N    =>   log2N(2是底数)

时间复杂度:0(logN)

注意:算法的复杂度计算,喜欢省略简写成logN,因为很多地方不好写底数,有些书本,或者网上资料会写成O (lgN),严格来说这个不对的

例题八:

long long int Factorial(int n)
{
	return n < 2 ? n : Factorial(n - 1) * n;
}

求时间复杂度?

循环次数:递归了N次

时间复杂度:0(N)

常见时间复杂度分析:

通过对比我们发现:

不同的时间复杂度是存在非常大的差距的,我们能实现越小越好。

二.空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法

我们还是通过例题来比较:

例一:

void Bubblesort(int* arr, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

首先:在这里,我们要明白时间是累计的,空间是不累计,所以,对于这题,我们发现变量只有3个(参数不算),大O渐进法表示为:O(1)

注意:该循环走了N次,重复利用的是一个空间

例二:

long long int Factorial(int n)
{
	return n < 2 ? n : Factorial(n - 1) * n;
}

算空间复杂度?

递归只在整体返回时才消除栈帧,递归调用了N层,每次调用建立一个栈帧,每个栈帧使用了常数个空间 ,所以空间复杂度为:O(1)

最后,诸君共勉!!!

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

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

相关文章

excel自定义函数之汉字转为拼音及大写字母

使用场景&#xff1a;想把姓名转化为拼音格式&#xff0c;然后拼音转为大写字母 至于怎么在excel里面自定义函数&#xff0c;自行百度都有&#xff0c;这里简单截图看看。 步骤&#xff1a;文件》选项》自定义功能区》 打开编辑窗口 把下面这段代码粘贴就能实现汉字转化为拼音…

Vulnhub 解决虚拟机网络问题

前言&#xff1a; 有的时候&#xff0c;我们从vulnhub官网下载ovf文件导入到虚拟机后&#xff0c;使用扫描器扫描存活的时候发现扫不到靶机的IP&#xff0c;这是因为虚拟机的网卡配置有问题。我们需要进安全模式修改一些配置。 1. 在虚拟机开机的时候按一下上下键&#xff0c;让…

FreeRTOS内存管理分析

目录 heap_1.c内存管理算法 heap_2.c内存管理算法 heap_3.c内存管理算法 heap_4.c内存管理算法 heap_5.c内存管理算法 内存管理对应用程序和操作系统来说非常重要&#xff0c;而内存对于嵌入式系统来说是寸土寸金的资源&#xff0c;FreeRTOS操作系统将内核与内存管理分开实…

Kubeadm部署Kubernetes Containerd集群

文章目录 概述一、硬件系统二、基础配置设置主机名配置主机名与IP地址解析关闭防火墙与selinux时间同步(ntp)升级系统内核配置内核转发及网桥过滤*安装ipset及ipvsadm关闭SWAP分区 三、Containerd准备Containerd获取下载解压Containerd配置文件生成并修改Containerd启动及开机自…

【项目管理】甘特图(2)——甘特图教程

哈喽啊&#xff0c;你好&#xff0c;我是雷工。 通过上节初步认识了甘特图&#xff0c;本节学习如何一步步创建甘特图&#xff0c;以下为学习笔记。 一、样例展示 下边记录创建甘特图的操作步骤&#xff0c;完成的实际效果如下图所示&#xff1a; 实例图的上端展示项目的重要…

ChatGLM2 大模型微调过程中遇到的一些坑及解决方法(更新中)

1. 模型下载问题 OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like bert-base-uncased is not the path to a directory containing a file named config.json. Checkout your internet con…

过了那么多1024节才知道……

各位大佬好啊&#xff0c;相信程序员们都知道1024节&#xff0c;那么咱程序员一般会采取什么样的方式来度过程序员节呢&#xff1f;那我们就继续往下看哦&#xff0c;小编包您满意&#xff01; 先来了解一下历史吧&#xff01;1024节的起源可以追溯到2009年&#xff0c;当时俄…

windows排除扫描文件夹

搜索防火墙和网络保护 点击病毒和威胁防护 往下拉&#xff0c;找到排除项 添加排除项

【在飞书捷径中用HTTP请求】

在飞书捷径的请求体中的变量&#xff0c;注意外面要有个双引号。

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

Linux下安装go

正式环境&#xff1a; 1、找到linux 版本go包 &#xff08;Downloads - The Go Programming Language&#xff09; 2、下载 wget https://dl.google.com/go/go1.17.5.linux-amd64.tar.gz3、解压到/usr/local &#xff08;官方推荐&#xff09; tar -C /usr/local -zxvf go1…

火狐挂代理访问问题Software is preventing Firefox from safely connecting to this site

1、报错 Software is preventing Firefox from safely connecting to this site2、解决步骤 火狐浏览器访问http://burp&#xff0c;右上角有下载按钮下载下来证书文件 在 Firefox 中设置证书颁发机构 (CA) 验证

小程序中打印机纸张都支持哪些尺寸?

在小程序中添加打印机功能是一项非常实用的功能&#xff0c;它可以让用户方便地将小程序中的内容打印出来。然而&#xff0c;当用户想要打印内容时&#xff0c;他们可能会关心打印纸张支持哪些尺寸。打印机分为四种打印机&#xff1a;小票、标签、发货单和电子面单。下面具体介…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大关键点分析

数字化时代银行网点厅堂营销需要抓住以下5大关键点&#xff1a; 1、精准识别客户&#xff1a;在数字化时代&#xff0c;银行网点厅堂营销的关键在于精准识别客户。通过利用大数据和人工智能技术&#xff0c;银行可以分析客户的行为和需求&#xff0c;从而更好地了解客户&#…

7 进制数字转换

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/base-7/description/ 给定一个整…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

《洛谷深入浅出基础篇》P3916 图的遍历——逆向搜索

上链接&#xff1a; P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3916上题干&#xff1a; 题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v) 表示从点 v 出发&#xff0c;能到…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

缓存穿透、缓存雪崩、缓存击穿问题的解决思路

一、缓存穿透 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&am…