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

转发: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,一经查实,立即删除!

相关文章

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 最为…

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

故事发生在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…

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;正确命令是没有空格的

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

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

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…

.NET中栈和堆的比较1

原文出处&#xff1a; http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx 尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection)&#xff0c;但是我们还是应该了解它们&#xff0c;以优化我们的…

前端学习(1):HTML和CSS导学

最近为什么捡起前端&#xff0c;主要工作太忙&#xff0c;有时间就会抓一下后端&#xff0c;前端是我以前啃得比较多的 再来一次呢&#xff0c;工作在忙也不能停止学习勒 第一部分 第二部分 第三部分 第四部分 如何学习

Spring Boot----Dubbo原理分析

环境&#xff1a;需要创建一个dubbo.xml 通过ImportResource()导入xml&#xff1a; 1、首先spring启动解析配置文件的每一个标签的总接口是 org.springframework.beans.factory.xml.BeanDefinitionParser 2、DubboBeanDefinitionParser是它的一个实现类&#xff0c;通过调用par…

前端学习(2):什么是html和css

什么是HTML&#xff1f; W3C&#xff1a;万维网联盟&#xff0c;是目前web技术领域最具权威和影响力的标准机构&#xff0c;目前为止&#xff0c;W3C已发布了200多项影响深远的web技术标准及实施指南。 Hypertext markup language:超文本标记语言&#xff0c;该语言书写的代码通…

基于小程序·云开发构建高考查分小程序丨实战

2019高考报名人数达到了 1031 万的新高&#xff0c;作为一名三年前参考高考的准程序猿&#xff0c;赶在高考前&#xff0c;加班加点从零开始做了一款高考查分小程序&#xff0c;算是一名老学长送给学弟学妹们的高考礼。上线仅 1 个月&#xff0c;用户数就突破了 1k&#xff0c;…

前端学习(3):vs code编辑器

下载地址 https://code.visualstudio.com 下载安装教程 变成中文 在编辑器中运行我们的网页 open in browser view in browser 选中文件----首选项----设置 常用快捷键

QuickPart应用系列

在上一篇解决方案包部署与收回篇章中&#xff0c;我只是稍微提了下QuickPart.也许刚接触这块内容的朋友&#xff0c;可能还不是很清楚&#xff0c;QuickPart具体的功能能实现什么。首先要告诉你的是QuickPart的人性化之处&#xff0c;那就是给开发人员开发webpart提供更简洁的方…

前端学习(4):chome浏览器

一、认识浏览器 浏览器是网页显示、运行的平台&#xff0c;常用的浏览器有IE、火狐&#xff08;Firefox&#xff09;、谷歌&#xff08;Chrome&#xff09;、Safari和Opera等。我们平时称为五大浏览器。IE最新版为Edge。 常用浏览器 二、浏览器市场份额 可以通过百度的统计网…

实战 IE8 开发人员工具

今天整理我收藏的漫画的时候发现 风云3 少了两集&#xff08;486、487&#xff09;&#xff0c;这对于收藏者来说基本是不可忍受的&#xff1b; 从风云一到三&#xff0c;应该一集也不能少的&#xff1b; 决定上网去找找&#xff0c;不过溜达一圈常去的分享论坛&#xff0c;由于…

前端学习(6):javascript简介

我们需要思考以下六个问题&#xff1a; 1、javaScript是什么&#xff1f; 2、javaScript的用途是什么&#xff1f; 3、javaScript和ECMAScript的关系是什么&#xff1f; 4、javaScript由哪几部分组成&#xff1f; 5、javaScript的执行原理是怎样的&#xff1f; 6、在页面…

前端学习(7):web的三大技术

HTML(5) 是一门标记型语言&#xff0c;主要由一些具备特殊含义的标签构成&#xff08;建筑物结构&#xff09; 所谓HTML是“超文本标记语言”的英文缩写。我们上网所看到网页&#xff0c;多数都是由HTML写成的。“超文本”是指页面内可以包含图片、链接&#xff0c;甚至音乐、…