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

目录

一、前言

二、时间复杂度

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…

“第五十五天”

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

【SpringBoot】Docker部署

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

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

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

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

vulnhub momentum 靶机复盘

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

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…

C++快餐——C++11(2)

如期待奇迹发生&#xff0c;那唯有不停伸手去抓紧&#xff0c;去把握才行。 文章目录 类成员变量缺省值default关键字delete关键字final关键字可变参数模板STL容器中empalce相关接口函数优点 lambda表达式捕获列表注意&#xff01;&#xff01;&#xff01;底层实现 总结 类成员…

leetcode-栈与队列

C中stack 是容器么&#xff1f; 栈&#xff0c;队列往往不被归类为容器&#xff0c;而被归类为container adapter(容器适配器)。因为由底层的容器实现&#xff0c;同时使用适配器模式的设计模式&#xff0c;封装了一层。 我们使用的stack是属于哪个版本的STL&#xff1f;SGI ST…

电路的电线的拼接

不积跬步无以至千里&#xff0c;今天小编也是复习今天学习的内容&#xff0c;废话不多说&#xff0c;看博客吧&#xff01;&#xff01;&#xff01; 目录 准备条件 操作 成品 准备条件 操作 将定制的套管插入导线当中&#xff0c;24V或者0V是尖端的端子&#xff0c;后面根…

基于SSM的养老院管理系统

基于SSM的养老院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 养老院管理系统是一个基于SSM&#xff08;Spring、Spring MVC、MyBatis&…

微信定时发圈,快人一步不落索

现在的社交媒体运营已经成为了私域流量获取的重要手段&#xff0c;而微信作为最大的社交平台之一&#xff0c;更是吸引了众多使用者。但是&#xff0c;你是否曾经感叹过每天手动发朋友圈的繁琐&#xff1f;是否希望能够事先设置好定时发送的功能&#xff0c;让你的朋友圈自动更…

Spring Boot 3系列之一(初始化项目)

近期&#xff0c;JDK 21正式发布&#xff0c;而Spring Boot 3也推出已有一段时间。作为这两大技术领域的新一代标杆&#xff0c;它们带来了许多令人振奋的新功能和改进。尽管已有不少博客和文章对此进行了介绍&#xff0c;但对于我们这些身处一线的开发人员来说&#xff0c;有些…

【JavaEE】HTTP协议

HTTP协议 HTTP是什么?HTTP 协议格式HTTP 请求格式HTTP响应格式协议格式总结 HTTP 请求 (Request)认识 URLURL 基本格式 关于 URL encode认识 "方法" (method)1. GET 方法2. POST 方法 认识请求 "报头" (header) HTTP 响应详解认识 "状态码" (st…