时间复杂度和空间复杂度

简介: 时间复杂度和空间复杂度

一. 算法效率

算法效率分析分为两种:


第一种是时间效率。时间效率也被称为时间复杂度,时间复杂度主要衡量的是一个算法的运行速度。

第二种是空间效率。空间效率也被称作空间复杂度,空间复杂度主要衡量一个算法所需要的额外空间。

PS:在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。所以算法效率主要取决于时间复杂度;如果是做芯片这样的,那么空间复杂度还是很重要的。


二. 时间复杂度

1. 介绍

时间复杂度定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间(即一个算法执行所耗费的时间)。


2. 大O的渐进表示法

从理论上说,是不能直接算出算法的运行时间的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个大致分析方式:一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。


举个例子:下面这个算法语句的执行次数为n^2,所以时间复杂度为 n^2

20210330110406204.png


3. 推导大O阶方法

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。


大O符号(Big O notation):是用于描述函数渐进行为的数学符号


用常数1取代运行时间中的所有加法常数。

在修改后的运行次数函数中,只保留最高阶项。

如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶

PS:一言以蔽之就是当我们计算出语句执行次数表达式时,假设n无限大,去掉了那些对结果影响不大的项,保留影响最大的项就是该算法的时间复杂度了。


三. 几个常见算法的时间复杂度分析

1. 二分法查找的时间复杂度 O(logN)

PS:为了方便把logx认为是以2为底x的对数


代码:


//二分查找函数
//arr为数组首元素地址
//num为需要查找的数
//size为数组长度
int Binary_Search(int* arr, int num, int size)
{
  int left = 0;
  int right = size - 1;
  while (left <= right)
  {
  int mid = (left + right) / 2;
  if (arr[mid] > num)
  {
    right = mid - 1;
  }
  else if (arr[mid] < num)
  {
    left = mid + 1;
  }
  else
  {
    return mid;//找到了返回对应的下标
  }
  }
  return -1;//找不到就返回-1
}


分析:从n个数里面查找一个数,找的过程就是和中间那个数比较,如果不相等的话就对应缩小一半的区间(此时数组长度n在原来的基础上除了2),在继续重复的查找。那么每次在数组中间位置查找,找不到就数组长度除以2,最后一次在中间位置找到了,从这里倒退回来,我们从原来长度为n的数组到现在数组长度一共除了几次2?(现在数组长度 * 2 * 2 * 2…2=n),除了几次2就是在最后一次比较找到了数之前我们查找了几次,那就是2的多少次方等于n?就是logn


PS:要真正的算查找了几次找到logn还要加上最后一次的查找的的那一次,总的查找次数就是(logn)+1,推导大O阶方法,当n无穷大时,多个1还是少个1影响不大,所以时间复杂度为O(logN)


2. 阶乘递归Factorial的时间复杂度 O(N)

递归算法的时间复杂度 = 递归次数 + 每次递归中函数的次数


代码:


long long Factorial(size_t N)
{
return N < 2 ? N : Factorial(N-1)*N;
}

分析:这个算法中:递归次数为n次,每次递归中函数的次数为1,所以时间复杂度为O(N)


3. 斐波那契递归Fibonacci的时间复杂度 O(2^N )

代码:


long long Fibonacci(size_t N)
{
return N < 2 ? N : Fibonacci(N-1)+Fibonacci(N-2);
}


分析:

20210330133107861.png

PS: 当n无穷大时,空缺的那部分影响不大,所以该算法的时间复杂度为O(2^N)


四 . 空间复杂度

空间复杂度是对一个算法在运行过程创建出来的临时占用存储空间大小的量度。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。


相关文章
|
前端开发 JavaScript
CSS实现禁用状态,样式设置以及不可点击事件的行为
CSS实现禁用状态,样式设置以及不可点击事件的行为
3801 0
|
网络性能优化 网络架构 网络协议
|
8月前
|
机器学习/深度学习 异构计算
CLIPer:开创性框架提升CLIP空间表征,实现开放词汇语义分割突破
对比语言-图像预训练(CLIP)在多种图像级任务上表现出强大的零样本分类能力,促使研究行人尝试将CLIP应用于像素级开放词汇语义分割,而无需额外训练。关键在于提升图像级CLIP的空间表征能力,例如,用自-自注意力图或基于视觉基础模型的自注意力图替换最后一层的自注意力图。本文提出了一种新颖的分层框架CLIPer,该框架分层提升了CLIP的空间表征能力。
257 5
|
10月前
|
JavaScript Java C#
【Typora-markdown语言】使用说明【指南】
Typora-markdown语言的使用说明和常见用法,好用的做笔记的工具软件及使用方法指南。目录 一、标题 二、段落 1、换行 2、分割线 三、文字显示 1、字体 2、上下标 四、列表 1、无序列表 2、无序列表 3、任务列表 五、区块显示 六、代码显示 1、行内代码 2、代码块 七、链接 八、脚注 九、图片插入 十、表格 十一、表情符号 语法: #(一级标题)##(二级标题)###(三级标题)。。。快捷键: Ctrl+数字1~6可以快速将选中的文本调成对
288 9
|
10月前
|
机器学习/深度学习 开发框架 人工智能
操作系统生态兼容与创新的平衡艺术
本次分享的主题是操作系统生态兼容与创新的平衡艺术,由中科方德周杰分享。主要分为五个部分: 1.操作系统生态中的兼容与创新之争 2.版本进化中库兼容与隔离平衡 3.跨架构生态的隔离与统一 4.多系统融合的生态新可能 5.生态兼容与创新平衡
250 2
|
10月前
|
存储 人工智能 弹性计算
云端问道6期方案教学-创意加速器:AI 绘画创作
本文整理自绍懿老师在云端问道第6期关于“创意加速器:AI绘画创作”的分享,主要介绍阿里云通义万相大模型的应用。内容涵盖七大部分:有趣的应用场景、通义万相简介、使用方法、优势特点、典型案例(如电商和营销场景)、收费标准及实操部署。通过这些内容,用户可以快速了解如何利用通义万相实现文字生成图片、图像编辑等功能,并应用于实际业务中,提升效率与创造力。
265 1
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
Linux 测试技术 Apache
国产 OpenEuler 向 CentOS 发起挑战:这场替代之战结局如何?
【10月更文挑战第3天】在服务器操作系统领域,CentOS 曾是首选,但因项目策略变化,寻找替代品变得迫切。本文将探讨国产开源操作系统 OpenEuler 是否能完美替代 CentOS。OpenEuler 具有强大的性能和稳定性,由国内社区推动,提供出色的安全性和及时更新。其包管理工具与 CentOS 类似,便于上手。
400 3
|
自动驾驶 安全 物联网
探索未来网络:从5G到6G的演进与创新
本文旨在探讨移动通信技术从5G向6G演进的过程及其关键技术,揭示这一领域的最新趋势和挑战。通过分析5G的现状、6G的预期目标和技术特点,本文展示了未来通信技术的广阔前景和潜在应用领域。
|
Java Unix Go
ida入门教程
ida入门教程
455 0
ida入门教程