时间复杂度空间复杂度分析

转发:https://blog.csdn.net/LF_2016/article/details/52453212

时间复杂度:

  一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用"O"来表示数量级,给出算法的时间复杂度。

                     T(n)=O(f(n));

  它表示随着问题规模的n的增大,算法的执行时间的增长率和f(n)的增长率相同,这称作算法的渐进时间复杂度,简称时间复杂度。而我们一般讨论的是最坏时间复杂度,这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,分析最坏的情况以估算算法指向时间的一个上界。

 

时间复杂度的分析方法:

1、时间复杂度就是函数中基本操作所执行的次数

2、一般默认的是最坏时间复杂度,即分析最坏情况下所能执行的次数

3、忽略掉常数项

4、关注运行时间的增长趋势,关注函数式中增长最快的表达式,忽略系数

5、计算时间复杂度是估算随着n的增长函数执行次数的增长趋势

6、递归算法的时间复杂度为:递归总次数 * 每次递归中基本操作所执行的次数

 

    常用的时间复杂度有以下七种,算法时间复杂度依次增加:O(1)常数型、O(log2 n)对数型、O(n)线性型、O(nlog2n)二维型、O(n^2)平方型、O(n^3)立方型、O(2^n)指数型.

 

 

空间复杂度:

  算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。

  S(n)=O(f(n))  若算法执行时所需要的辅助空间相对于输入数据量n而言是一个常数,则称这个算法的辅助空间为O(1); 

  递归算法的空间复杂度:递归深度N*每次递归所要的辅助空间, 如果每次递归所需的辅助空间是常数,则递归的空间复杂度是 O(N).

例:

1、求二分法的时间复杂度和空间复杂度。

非递归:

template<typename T>
T* BinarySearch(T* array,int number,const T& data)
{assert(number>=0);int left = 0;int right = number-1;while (right >= left){int mid = (left&right) + ((left^right)>>1);if (array[mid] > data){right = mid - 1;}else if (array[mid] < data){left = mid + 1;}else{return (array + mid);}}return NULL;
}

分析:

 

循环的基本次数是log2 N,所以:

时间复杂度是O(log2 N);

由于辅助空间是常数级别的所以:

空间复杂度是O(1);

 

递归:

template<typename T>
T* BinarySearch(T* left,T* right,const T& data)
{assert(left);assert(right);if (right >=left){T* mid =left+(right-left)/2;if (*mid == data)return mid;elsereturn *mid > data ? BinarySearch(left, mid - 1, data) : BinarySearch(mid + 1, right, data);}else{return NULL;}
}

 

递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:

时间复杂度:O(log2 N)

空间复杂度:O(log2N )

 

2、斐波那契数列的时间和空间复杂度

//递归情况下的斐波那契数列

long long Fib(int n)
{assert(n >= 0);return n<2 ? n : Fib(n - 1) + Fib(n-2);
}

递归的时间复杂度是:  递归次数*每次递归中执行基本操作的次数

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

递归的空间复杂度是:  递归的深度*每次递归所需的辅助空间的个数

所以空间复杂度是:O(N)

 

//求前n项中每一项的斐波那契数列的值

long long *Fib(int  n)
{assert(n>=0);long long *array = new long long[n + 1];array[0] = 0;if (n > 0){array[1] = 1;}for (int i = 2; i <n+1; i++){array[i] = array[i - 1] + array[i - 2];}return array;
}

循环的基本操作次数是n-1,辅助空间是n+1,所以:

时间复杂度O(n)

空间复杂度O(n)

//非递归

long long Fib(int n)
{assert(n >= 0);long long first=0,second=1;for (int i = 2; i <= n; i++){first = first^second;second = first^second;first = first^second;second = first + second;}return second;
}

循环的基本次数是n-1,所用的辅助空间是常数级别的:

时间复杂度:O(n)

空间复杂度:O(1)

 

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

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

相关文章

HDU 1284 钱币兑换问题 (动态规划 背包方案数)

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15134 Accepted Submission(s): 9117 Problem Description 在一个国家仅有1分&#xff0c;2分&#xff0c;3分硬币&#xff0c;将钱N兑换成硬币有很…

github(5):GitHub的注册与使用(详细图解)

首先,你需要注册一个 github账号,最好取一个有意义的名字&#xff0c;比如姓名全拼&#xff0c;昵称全拼&#xff0c;如果被占用&#xff0c;可以加上有意义的数字. 本文中假设用户名为 chuaaqiCSDN(我的博客名的全拼) 一、gihub账号注册与仓库创建 1. 注册账号: 地址: https…

Hive分区和桶的概念

Hive 已是目前业界最为通用、廉价的构建大数据时代数据仓库的解决方案了&#xff0c;虽然也有 Impala 等后起之秀&#xff0c;但目前从功能、稳定性等方面来说&#xff0c;Hive 的地位尚不可撼动。 其实这篇博文主要是想聊聊 SMB join 的&#xff0c;Join 是整个 MR/Hive 最为…

git学习(6):删除github镜像

怎样删除GitHub上的项目 第一步&#xff1a;双击GitHub的项目workhard(举例) 第二步&#xff1a;确认项目可以删除&#xff0c;双击settings 第三步&#xff1a;找到 Delete this repository按钮并单击 第四步&#xff1a;在弹出的模态框框中输入需要删除的项目名字&#xff…

剧情介绍:“肖申克的救赎”

故事发生在1947年&#xff0c;银行家安迪因为妻子有婚外情&#xff0c;用枪杀死了她和她的情人&#xff0c;因此他被指控枪杀了妻子及其情人&#xff0c;安迪被判无期徙刑&#xff0c;这意味着他将在肖恩克监狱中渡过余生。  阿瑞1927年因谋杀罪被判无期徙刑&#xff0c;数次…

Spring Boot----Dubbo

概述 治理和维护各个分系统 参考官网&#xff1a;http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html &#xff08;可中英文切换&#xff09; 下载安装Zookeeper linux 使用docker部署 windows: 参考&#xff08;https://blog.csdn.net/ring300/a…

hadoop join

在介绍这个实例之前&#xff0c;请各位参考&#xff1a;http://bjyjtdj.iteye.com/blog/1453410。 reduce side join是一种最简单的join方式&#xff0c;其主要思想如下&#xff1a; 在map阶段&#xff0c;map函数同时读取两个文件File1和File2&#xff0c;为了区分两种来源的…

git学习(8):windows系统下VI编辑器的基本使用

vi编辑器是Linux系统下标准的编辑器.而且不逊色于其他任何最新的编辑器.但是在windows系统中如何使用VI编辑器呢&#xff1f; 下面给大家介绍在git环境下的vi编辑器的简单用法和部分命令. 工具原料&#xff1a;git2.7.2, 下载地址&#xff1a;https://git-for-windows.githu…

BUUOJ misc 二维码

一个二维码&#xff0c;扫一下是提示&#xff1a;secret is here 用binwalk看一下&#xff1a; binwalk QR_code.pngDECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 …

IXMLDOMDocument中的load方法返回值有BUG

IXMLDOMDocument中的load方法返回值是否有BUG IXMLDOMDocument中load一个xml文件时&#xff0c;返回值和msdn上说的不符MSDN上说的是&#xff1a;Return ValuesS_OK The value returned if successful. S_FALSE The value returned if the load fails. E_INVALIDARG The val…

hadoop join之map side join

在本例中&#xff0c;我们仍然采用上一例中的数据文件。之所以存在reduce side join&#xff0c;是因为在map阶段不能获取所有需要的join字段&#xff0c;即&#xff1a;同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的&#xff0c;因为shuffle阶段要进行…

git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”

问题&#xff1a; 创建ssh key时遇到“Bad escape character ‘ygen’.” image.png $ ssh -keygen -t rsa -C "" Bad escape character ygen. 分析原因&#xff1a;ssh -keygen之间出现了空格&#xff0c;正确命令是没有空格的

Web中的鼠标自动移动

其实只是一个模拟&#xff0c;思路是这样的&#xff1a;让鼠标消失&#xff0c;再用一个跟鼠标一样的图片跟随鼠标移动&#xff0c;这样我们就可以控制这个图片的移动了。。。囧&#xff5e; 怎样让鼠标消失呢&#xff0c;就是做一个高宽1px的透明cur文件&#xff0c;并把其设置…

用小程序·云开发打造运动圈小程序丨实战

乒乓圈小程序 和朋友合伙写了一个小程序&#xff0c;写了一个以共享乒乓信息和交流的平台———乒乓圈。我们使用了微信的云开发来完成数据和后台的作用。免去了租赁服务器。 我主要负责的是数据库的设计和云函数实现数据获取和触发器的功能和简单的两个页面。 正文 功能展示 页…

hadoop join之semi join

SemiJoin&#xff0c;也叫半连接&#xff0c;是从分布式数据库中借鉴过来的方法。它的产生动机是&#xff1a;对于reduce side join&#xff0c;跨机器的数据传输量非常大&#xff0c;这成了join操作的一个瓶颈&#xff0c;如果能够在map端过滤掉不会参加join操作的数据&#x…

git学习(9):git 添加 ssh keys 出现如下错误

git 添加 ssh keys 出现如下错误&#xff1a; Key is invalid. It must begin with ssh-ed25519, ssh-rsa, ssh-dss, ecdsa-sha2-nistp256, ends 在终端输入如下命令 $ ssh-keygen -t rsa -b 4096 -C "809753922qq.com" 最后得到 id_rsa.pub $ cd ~/.ssh $ vi id…

BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试

在Web表单提交后解析表单时&#xff0c;一般框架都提供了某种方式可以自动从表单映射到我们的POJO类里面。属性会被自动填充的。 但如果我们在某个需求里&#xff0c;真的需要用程序来解析的话&#xff0c;那么如果有几百个属性&#xff0c;可就是一个噩梦了。 我们可以用java的…

【vue开发】vue导出Excel表格教程demo

前端工作量最多的就是需求&#xff0c;需求就是一直在变&#xff0c;比如当前端数据写完之后&#xff0c;需要用Excel把数据下载出来&#xff1b;再比如前端在没有数据库想写些demo玩时&#xff0c;也是很好的选择。 第一步安装依赖包,修改配置 1、装依赖&#xff1a; cnpm ins…

git学习(10):Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)

将本地项目上传到Github&#xff08;两种简单、方便的方法&#xff09; 一、第一种方法&#xff1a; 首先你需要一个github账号&#xff0c;所有还没有的话先去注册吧&#xff01; https://github.com/ 我们使用git需要先安装git工具&#xff0c;这里给出下载地址&#xff0…

MapReduce 中的两表 join 几种方案简介

1. 概述 在传统数据库&#xff08;如&#xff1a;MYSQL&#xff09;中&#xff0c;JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作&#xff0c;同样常见且耗时&#xff0c;由于Hadoop的独特设计思想&#xff0c;当进行JOIN操作时&#xff0c;有一些特殊的技巧。 …