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

目录

一、前言

二、时间复杂度

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;elsereturn 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;elsereturn Fibonaci(n - 1) + Fibonaci(n - 2);
}

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

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

相关文章

编译运行windows+OpenMVG+OpenMVS+vs2017

安装vcpkg过程需要翻墙&#xff01;&#xff01;&#xff01; github下载代码 git clone https://github.com/microsoft/vcpkg git clone https://github.com/cdcseacave/VCG.git git clone https://github.com/cdcseacave/openMVS.git src安装vcpkg包 cd .\vcpkg .\bootstr…

HC32M120时钟配置内部时钟为48MHz

HC32M120 时钟比较简单&#xff0c;外部时钟最高只支持20MHz&#xff0c;并且没有PLL&#xff0c;想要48M时钟只能通过内部HRC时钟配置&#xff0c;经过一番研究发现可以直接在hc32m120_icg.h中配置上电时钟为48MHz即可&#xff0c;如果不配置直接使用CLK_HRCInit(CLK_HRC_ON, …

AcWing92 递归实现指数型枚举:输出1~n的所有子集

题目 从 1∼ n n n 这 n n n 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入格式 输入一个整数 n n n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 1 个空格隔开。 对于没有选任何数的方案&#xff0c…

“第五十五天”

定点数&#xff1a; 原码的乘法&#xff1a; 乘法的符号位是单独处理的&#xff08;通过对被乘数和乘数的符号位进行异或实现&#xff09;&#xff0c;数值位去绝对值进行运算。这里的乘法实际上是通过多次加法实现的。 这里被乘数是放在x寄存器&#xff0c;乘数放在MQ寄存器…

【SpringBoot】Docker部署

docker部署是主流的部署方式&#xff0c;极大的方便了开发部署环境&#xff0c;保持了环境的统一&#xff0c;也是实现自动化部署的前提。 1 项目的目录结构 package: 点击打包&#xff0c;生成 xxx-SNAPSHOT.jar target目录: 打包生成目录&#xff0c;生成的jar存放位置Docke…

三种前端埋点方式

什么是埋点 埋点是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 我们可以知道埋点实际上是对特定事件或…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

10.30 知识总结(标签分类、css介绍等)

一、 标签的分类 1.1 单标签 img br hr <img /> 1.2 双标签 a h p div <a></a> 1.3 按照标签属性分类 1.3.1 块儿标签 即自己独自占一行 h1-h6 p div 1.3.2 行内(内联)标签 即自身文本有多大就占多大 a span u i b s 二、 标签的嵌套 标签之间是可以互相…

iTransformer: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING

#论文题目&#xff1a;ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING #论文地址&#xff1a;https://arxiv.org/abs/2310.06625 #论文源码开源地址&#xff1a;https://github.com/thuml/Time-Series-Library #论文所属会议&#xff1a;Mach…

基于单片机的智能清洁小车设计—控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的主要内容和目标二、总体方案设计2.1智能清洁小车的硬件系统组成2.2智能清洁小车的硬件结构图 三、 小车结构设计5.1基本布局和功能分析5.2小车二维及三维图小车三维图&#xff1a; 四、 原理图程序 五、…

在CentOS 7中手工打造和运行xml文件配置的Servlet,然后使用curl、浏览器、telnet等三种工具各自测试

下载Openjdk并配置环境变量 https://jdk.java.net/java-se-ri/11-MR2是官网下载Openjdk 11的地方。 sudo wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz下载openjdk 11。 sudo mkdir -p /usr/openjdk11创建目录&#xff…

UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

教程https://www.youtube.com/watch?vsWpENaVGj2M&listPLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index10&ppiAQB 相关蓝图 连招逻辑 动画通知类 逻辑分析 1.用户输入 已搭载战斗系统模块,可以收到输入指令 2.连击 第一次攻击&#xff1a; 第一次攻击&#xff0c;…

Qt中设置鼠标透明度的应用及示例

Qt中设置鼠标透明度的应用及示例 介绍设置鼠标透明度的方法应用场景遮罩层可视化效果 结论 介绍 Qt是一个功能强大的跨平台应用程序开发框架&#xff0c;可以用于开发各种类型的应用程序。在Qt中&#xff0c;我们可以设置鼠标的透明度&#xff0c;即将鼠标事件传递给下方的控件…

vulnhub momentum 靶机复盘

环境配置 到学校了 原来的桥接配置要改 这里记录几个点备忘 1.virtualbox 桥接 未指定 重新安装驱动VBoxNetLwf.inf 2.配置完靶机启动失败 手动安装VBoxNetLwf.inf 不要用virtualbox自带的netlwfinstall 3.配置完nmap扫不到 rw init/bin/bash 进去看看网卡配置 信息收集…

Docker底层原理:UFS的使用

文章目录 前言检查系统是否支持OverlayFS准备两个目录加载OverlayFS模块创建OverlayFS使用OverlayFS卸载OverlayFS 前言 Linux中常用的联合文件系统有OverlayFS和Aufs(Another Union File System), OverlayFS是Linux内核自带的联合文件系统, 而Aufs则是第三方提供的联合文件系…

C语言_字符串和内存函数

文章目录 前言一. strlen二. strcpy三.strcat四. strcmp &#xff08;字符串比较&#xff09;五. strncpy六. strncmp七. strstr八. strtok九 . strerror perror十. 字符分类函数十一. memcpy (内存拷贝&#xff09;十二. memmove(可以重叠拷贝 也可以实现不重叠的内存拷贝) 前…

VC++程序崩溃时,使用Visual Studio静态分析dump文件

Window环境下的C程序如果发生异常崩溃&#xff0c;首先会和客户联系&#xff0c;让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话&#xff0c;从log一般分析不出特定原因&#xff0c;这时候dump文件就起作用了。可以通过Visual Studio和Windbg来静态…

java八股文(基础篇)

面向过程和面向对象的区别 面向过程&#xff1a;在解决问题时&#xff0c;特别自定义函数编写一步一步的步骤解决问题。 面向对象&#xff1a;其特点就是 继承&#xff0c;多态&#xff0c;继承&#xff0c;在解决问题时&#xff0c;不再注重函数的编写&#xff0c;而在于注重…

高效学习工具之Anki新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片&#xff08;&#xff09;1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 1.4 开启v3算法&#xff0c;设置排程1.4 自定义排程 2 操作卡牌&#xff08;位于卡牌界面中“游览”&a…

数据库认证 | Oracle OCP好考吗

数据库对于很多技术人员来说都不陌生&#xff0c;但是你想深入了解的话&#xff0c;那么考个证书也许就是一个不错的选择。 如果能考个Oracle OCP认证的话&#xff0c;那也确实不错。那么Oracle OCP好考吗&#xff1f;下面我们就来了解一下吧。 01 Oracle OCP好考吗 OCP考试还…