算法的时间复杂度及空间复杂度

目录

一、前言

二、时间复杂度

1.时间复杂度定义

2.时间复杂度描述方法

三、实例代码

实例1(取影响最大的项)

实例2(舍去系数)

实例3(不确定大小关系的用max函数取最大)

实例4(常数次的时间复杂度取O(1))

实例5(取最坏时间复杂度)

实例6(不能通过循环层次确定时间复杂度,需要理解算法思想)

实例7(时间复杂度中,以2为底的对数可以省略底数2,直接写成logN,但是其他底数不可以省略)

实例8(递归的时间复杂度是递归的次数)

实例9(双目递归的时间复杂度)


一、前言

如何衡量一个算法的好坏?

看时间复杂度和空间复杂度

二、时间复杂度

1.时间复杂度定义

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

一个算法所花费的时间与其中语句执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

2.时间复杂度描述方法

大O复杂度表示法

求算法中语句的执行次数总和:

(1)取影响最大的项

(2)舍去系数

(3)常数次的时间复杂度取O(1)

(4)不确定大小关系的,用max函数取最大

(5)求和出现多种情况的,取最坏时间复杂度

(6)不可根据循环层次来确定时间复杂度,需要明白算法思想确定时间复杂度

 (7)时间复杂度中,以2为底的对数可以省略底数2,直接写成logN,但是其他底数不可以省略

(8)递归的时间复杂度是递归的次数

三、实例代码

实例1(取影响最大的项)

F(N)=N*N+2N+10

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

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;
}
实例2(舍去系数)

F(N)=2N+10

时间复杂度:O(N) 

void Func2(int N)
{
	int count = 0;
	for (int k = 0; k < 2 * N; ++k)
		++count;
	int M = 10;
	while (M--)
		++count;
}
实例3(不确定大小关系的用max函数取最大)

F(N)=M+N

时间复杂度:O(max(M,N))  

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;
}
实例4(常数次的时间复杂度取O(1))

(常数次的时间复杂度取O(1), O(1)并不是代表1次,而是常数次)

F(N)=200

时间复杂度:O(1) 

void Func4(int N)
{
	int count = 0;
	for (int k = 0; k < 200; ++k)
		++count;
}
实例5(取最坏时间复杂度)

时间复杂度:O(N) 

const char* strchr(const char* str, int character)
{
	while (*str)
	{
		if (*str == character)
			return str;
		++str;
	}
}
实例6(不能通过循环层次确定时间复杂度,需要理解算法思想)

这是一个快速排序(Quick Sort)算法的核心代码,函数Swap用来交换两个变量的值,函数PartSort用来进行快排的分区操作

具体地,快速排序的思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行。

PartSort函数中,首先选取最左边的元素作为关键字keyi,使用两个指针leftright分别从数组的左端和右端开始向中间扫描,找到第一个大于等于关键字的元素和第一个小于等于关键字的元素,然后交换它们的位置,直到leftright相遇。最后再将关键字元素与left所指向的元素进行交换,此时,keyi左边的元素均小于等于keyi,右边的元素均大于等于keyi,完成了一次分区操作。

时间复杂度:O(N)

int PartSort(int* a, int left, int right)
{
	int keyi = left;
	while (left < right)
	{
		while (left < right && a[right] >= a[keyi])//找小
			--right;
		while (left < right && a[left] <= a[keyi])//找大
			++left;
		Swap(&a[left], &a[right]);
	}
	Swap(&a[keyi], &a[left]);
}
实例7(时间复杂度中,以2为底的对数可以省略底数2,直接写成logN,但是其他底数不可以省略)

时间复杂度:O(logN)

//整型有序数组的二分查找法
int binary_search(int arr[], int size, int num)
{
	int left = 0;
	int right = size - 1;
	int mid = (right - left) / 2 + left;//优化取平均值的计算方法
	while (left <= right)
	{
		if (arr[mid] < num)
		{
			left = mid + 1;
			mid = (right - left) / 2 + left;
		}
		else if (arr[mid] > num)
		{
			right = mid - 1;
			mid = (right - left) / 2 + left;
		}
		else if (arr[mid] == num)
		{
			return mid;
		}
	}
	return -1;
}
实例8(递归的时间复杂度是递归的次数)

时间复杂度:O(N)

//求n的阶乘
long long Fac(long long n)
{
    assert(n >= 1);
    if (n == 1)
        return 1;
    else
        return n * Fac(n - 1);
}
实例9(双目递归的时间复杂度)

其实这样计算一种粗略的计算,因为上图二叉树实际上是不满的。但由于时间复杂度的计算本身就是估算,所以不影响。

F(N)=2^0+2^1+2^2+……+2^(N-3)+2^(N-2) = 2^(N-1)+2^0

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

该算法效率极其低,实用性不大,且2^n结果随着n的增大是指数性暴增

//求斐波那契数列前n项和
long long Fibonaci(long long n)
{
    if (n < 3)
        return 1;
    else
        return Fibonaci(n - 1) + Fibonaci(n - 2);
}

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

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

相关文章

Windows原生蓝牙编程 第二章 选取设备输入配对码并配对【C++】

蓝牙系列文章目录 第一章 获取本地蓝牙并扫描周围蓝牙信息并输出 第二章 选取设备输入配对码并配对 文章目录 前言头文件一、选择想要配对的设备并设置配对码1.1 设置配对码1.2 选择设备并配对 二、全部代码三、测试结果总结 前言 接着第一章&#xff0c;我们已经把扫描到的蓝…

Leetcode 43. 字符串相乘 中等

题目 - 点击直达 1. 43. 字符串相乘 中等1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 思路一 做加法1. 思路分析2. 时间复杂度3. 代码实现 3. 思路二 做乘法1. 思路分析2. 时间复杂度3. 代码实现 1. 43. 字符串相乘 中等 1. 题目详情 给定两个以字符串形式表示的非负整…

Acrobat Pro DC 2023 PDF编辑器 for Mac

Acrobat Pro DC是一款由Adobe开发的专业级PDF编辑和管理软件。作为PDF行业的标准工具&#xff0c;它提供了广泛的功能和工具&#xff0c;适用于个人用户、企业和专业人士。 Acrobat Pro DC具备丰富的编辑功能&#xff0c;可以对PDF文件进行文本编辑、图像编辑和页面重排等操作。…

订水商城H5实战教程-05权限控制

目录 1 判断用户是否登录2 创建事件流3 获取不到Userid的问题4 权限控制整体效果 我们上一篇讲解了用户注册的功能&#xff0c;当用户注册完毕的时候再次打开小程序的时候就需要验证权限。权限分为两类&#xff0c;第一类是判断用户是否注册&#xff0c;第二类是当前用户具备什…

Linux启动之uboot分析

Linux启动之uboot分析 uboot是什么&#xff1f;一、补充存储器概念1.存储器种类1.norflash - 是非易失性存储器&#xff08;也就是掉电保存&#xff09;2.nandflash - 是非易失性存储器&#xff08;也就是掉电保存&#xff09;3.SRAM - 静态随机访问存储器 - Static Random Acc…

什么是鉴权?一篇文章带你了解postman的多种方式

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通…

MySQL(3):基本的 SELECT 语句

SQL 语言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是使用关系模型的数据库应用语言&#xff0c; 与数据直接打交道 。 SQL 有两个重要的标准&#xff0c;分别是 SQL92 和 SQL99&#xff0c;它们分别代表了 92 年和 99 年颁布的 SQL 标…

一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)

本文主要讲述了一体化模型进行去噪、去雨、去模糊&#xff0c;也就是说&#xff0c;一个模型就可以完成上述三个任务。实现了良好的图像复原功能&#xff01; 先来看一下美女复原.jpg 具体的&#xff1a; 在图像恢复任务中&#xff0c;需要在恢复图像的过程中保持空间细节…

windows应用软件扫描报告 不告谱 要钱

chatGPT开路&#xff0c;帮找。 当你想要查找Windows软件的漏洞而不涉及查看源代码时&#xff0c;你可以使用一些专门设计用于扫描漏洞的工具。这些工具通常会检查已安装的软件和操作系统的漏洞&#xff0c;并提供建议或修补程序。以下是一些可以用于查找Windows软件漏洞的工具…

SQL优化(慢查询优化方法)正确使用数据库索引

文章目录 (一) 建立索引的正确姿势1 &#xff09;索引不要包含选择性过低字段2&#xff09; 选择性高的字段前置或者单独建立索引3&#xff09;尽量使用覆盖索引 (二) 使用索引的正确姿势1&#xff09; 最左匹配截断2&#xff09; 隐式转换3&#xff09; in order by 导致排序失…

R2R 的一些小tip

批次间控制器(Run-to-run Controller)&#xff0c;以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术&#xff0c;可在运行(如批次或晶圆…

Matlab | 基于二次谱提取地震数据的地震子波

本文通过地震数据二次谱求取地震子波谱&#xff0c;具体方法如下&#xff1a; MATLAB代码实现如下&#xff1a; function w SndSpecExtWavelet(x, M) % 功能&#xff1a;基于二次谱提取输入地震数据data的地震子波wavelet % Extracting Wavelet from Input Seismic Dat…

Flutter 使用 GetX 中遇到的问题

创建了控制器&#xff0c;但是在别的页面中&#xff0c;无法引用控制器里面的某些变量 如下图&#xff1a;后来发现&#xff0c;是命名的问题&#xff0c; 如果是以 _ 下划线开头的变量&#xff0c;那么就无法被引用

测开(性能测试---LoadRunner)

目录 一、LoadRunner的安装 二、Loadrunner的基本概念 三、开发测试脚本——VUG 3.1 脚本录制 3.2 脚本加强 四、设计场景——Controller LoadRunner是一款开源桌面应用软件&#xff0c;可用来模拟用户负载完成性能测试工作&#xff0c;LoadRunner的功能在版本不断升级的…

SDP协议分析

目录 SDP的结构SDP语法必需字段可选字段字段顺序子字段 3.SDP例子 1. SDP的结构 SDP&#xff08;Session Description Protocol&#xff09;完全是⼀种会话描述格式&#xff0c;它不属于传输协议&#xff0c;它只使⽤于适当的传输协议&#xff0c;包括会话通知协议&#xf…

ERROR: There can be only one Game target per project.

UATHelper: Packaging (Windows (64-bit)): ERROR: There can be only one Game target per project. D:\dock\Intermediate\Source 把旧的文件删去 一般会出现在更改项目名称后 感谢 There can be only one Game target per project - Development Discussion / Content C…

关于Spring和SpringBoot中对配置文件的读取

Spring读取xml文件 具体流程见网址Spring源码分析2 — spring XML配置文件的解析流程 - 知乎 (zhihu.com) 我这里只做一下总结和自己的理解&#xff1a; &#xff08;1&#xff09;通过getConfigLocations方法, 从web.xml文件中读取配置文件地址&#xff0c;如果web.xml中读取…

使用 jdbc 技术升级水果库存系统(后端最终版本,不包含前端)

1、配置依赖 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>junit</groupId><…

智能工厂解决方案

智能工厂解决方案&#xff1a;生产工单 智能工厂解决方案&#xff1a;物流中转 样品单-4.2寸 工单任务卡-4.2寸 工单流转卡-4.2寸 生产配送卡-4.2寸 工序参数卡-7.5寸 生产拣配单-7.5寸 仓库24代-参数 接收路由器发送的数据信息并解析&#xff0c;做出相应的指示&#…

图片去除水印文字怎么去除?这几个方法快来收藏

图片怎么去除水印文字&#xff1f;现在嘛&#xff0c;图片已经成了我们生活和工作里必不可少的一部分&#xff0c;可是有时候看图的时候&#xff0c;总会碰到一些带水印的图片&#xff0c;这些水印总是搞得图片看起来不那么爽&#xff0c;所以很多人都想知道图片怎么去除水印文…