当前位置: 首页 > news >正文

时间空间复杂度——详解

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

大O的渐进表示法:

  1. 用常数1取代运行时间中所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶存在且不是1,则去除与这个项目相乘的常数。的=得到的结果就是打O阶。

注意:大O阶渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

在实际中算法的时间复杂度包含最好、最差、平均情况,而一般关注关注的是算法的最坏运行情况

例子1:

//计算Func1时间复杂度
void Func1(int N)
{
	int count = 0for(int k = 0;k<2*N;++K)//循环执行了2*N次
	{
		++count;
	}
	int M=10;	
	while(M--)//执行M=10次。
	{
		++count;
	}	
	printf("%d\n",count);
 } 

分析可知:基本操作执行了2N+10次,由大O阶渐进表示法为O(N)
例子2:

//计算Bubblesort的时间复杂度
void Bubblesort(int* a,int n)
{
	assert(a);
	for(size_t end=n;end>0;--end)
	{
		int exchange=0;
		for(size_t i=1;i<end;++i)
		{
			if(a[i-1]>a[i])
			{
				swap(&a[i-1],&a[i]);
				exchange = 1;
			}
		}
		
		if(exchange == 0)
		{
			break;
		}
	}
 } 

分析可知:由冒泡排序可知最好执行状态就是N次,最坏执行了N*(N+1)/2,由大O阶渐进表示法时间复杂度为O(N^2)
例子3:

//计算BinarySearch的时间复杂度
int BinarySearch(int* a,int n,int x)
{
	assert(a);
	
	int begin =0;
	int end =n-1;
	
	while(begin<end)
	{
		int mid=begin+((end-begin)/2);
		if(a[mid]<x)
		begin=mid+1;
		else if(a[mid]>x)
		end=mid;
		else
		return mid;
	}
	return -1;
 } 

分析可知:可知该算法是二分查找算法可以知道最好状态下执行1次就成功了,最坏情况下也就O(logN),所以复杂度为O(logN)

空间复杂度: 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,所以空间复杂度算的就是变量的个数。用大O渐进表示法表示。
例子1:

//计算BubbleSort的空间复杂度
void BubbleSort(int* a,int n)
{
	assert(a);
	
	for(size_t end=n;end>0;--end)
	{
		int exchange=0;
		for(size_t i=1;i<end;++i)
		{
			if(a[i-1]>a[i])
			{
				swap(&a[i-1],&[i]);
				exchang=1;
			}
		}
		if(exchange ==0)
		break;
	}
 } 

分析可知:可知冒泡排序所用的常数个额外空间,所以其看空间复杂度为O(1)
例子2:

 // 计算Fibonacci的空间复杂度?
long long* Fibonacci(size_t n)
{
 
if(n==0)
 
return NULL;
 
 
long long * fibArray = new long long[ n+1];
 
fibArray[0] = 0;
 
fibArray[1] = 1;for (int i = 2; i <= n ; ++i)
 {
 
fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];
 }
 
return fibArray ;
}

分析可知:动态开辟了N个空间,所以空间复杂度为O(N)
例子3:

// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N)
{
 
return N < 2 ? N : Factorial(N-1)*N;
}

分析可知:递归调用N次,开辟了N个栈帧,每一个栈帧使用了常数个空间。所以空间复杂度为O(N)

相关文章:

  • 【数据结构:队列】——队列的实现(C语言)
  • 【数据结构:栈】——栈的实现(C语言)
  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • 【Linux】进程地址空间了解
  • 【Linux】入门基础命令(1)
  • c++入门——基础知识点(2)
  • 【Linux】基础文件的I/O操作(1)
  • 【Linux】进程信号
  • 【Linux】网络编程套接字(1)
  • 【Linux】UDP网络套接字编程
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 07.Android之多媒体问题
  • 4个实用的微服务测试策略
  • es6(二):字符串的扩展
  • leetcode-27. Remove Element
  • MySQL用户中的%到底包不包括localhost?
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Node项目之评分系统(二)- 数据库设计
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 阿里云购买磁盘后挂载
  • 分享一份非常强势的Android面试题
  • 两列自适应布局方案整理
  • Python 之网络式编程
  • 国内开源镜像站点
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #100天计划# 2013年9月29日
  • $.ajax,axios,fetch三种ajax请求的区别
  • (23)Linux的软硬连接
  • (C++)八皇后问题
  • (Git) gitignore基础使用
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (南京观海微电子)——I3C协议介绍
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)winform之ListView
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .java 9 找不到符号_java找不到符号
  • .NET BackgroundWorker
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Web项目创建比较不错的参考文章
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net快速开发框架源码分享
  • @Autowired @Resource @Qualifier的区别
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C/C++]数据结构 循环队列