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

数据结构第一课 —— 时间和空间复杂度

目录

  • 一、什么是数据结构?
  • 二、关于算法的好坏
    • 1、算法效率
  • 三、时间复杂度
    • 1、时间复杂度是什么?
    • 2、关于大O表示法
      • (1)大O的渐进表示法
      • (2)大O阶方法的推导
  • 四、空间复杂度
    • 空间复杂度是什么?

一、什么是数据结构?

Alt要想学好数据结构,我们首先要知道数据结构是什么?
在百度搜索中,我们可以找到这个问题的答案:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

二、关于算法的好坏

在了解什么是数据结构后,我们再来思考一个问题:我们如何来评断一个算法的好坏?
是通过算法运行的时间还是通过算法开辟的空间?究竟是时间更为重要还是空间更为重要呐?
下面,我们就来解答这个问题。

1、算法效率

算法的效率分为两种:一是时间效率,二是空间效率。其中,时间效率被称为时间复杂度;同样的,空间效率被称为空间复杂度

时间复杂度:主要用来衡量一个算法的运行速度
空间复杂度:主要用来衡量一个算法所需要的额外空间

虽然两种效率所衡量的对象不同,但是,两种效率对于算法来说都很重要,但在目前来说,对于一个算法评断它的好坏时:时间复杂度>>空间复杂度

三、时间复杂度

1、时间复杂度是什么?

首先,我们来了解一下什么是时间复杂度。

时间复杂度:在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数它定性描述该算法的运行时间

简单来说:算法中基本操作的执行次数,为该算法的时间复杂度。

2、关于大O表示法

(1)大O的渐进表示法

要想计算某算法的时间复杂度,首先要学会大O表示法。
首先举个例子:

public class Test {
    public static void main(String[] args) {
        int count=0;
        for (int i = 0; i < N; i++) {
            count++;
        }
    }
}

如果说要计算上面算法的时间复杂度。
我们知道,count=0; int i=0;这两部分是只进行一次的。所以对于这两部分来说,一共是2个时间单元
i<N部分一共是N+1个时间单元(在最后一次还要比较一下)。
i++和count++部分一共是2*N个时间单元
那么,这个算法一共需要3*N+3个时间单元。

N11000
3*N+3630003
3*N930000
N110000

由上表,我们可以看出,对于N很大的情况下,常数对我们的时间复杂度影响不大。然而,当N变大的情况下,N前的系数对于时间复杂度的影响也渐渐减小了。
所以,我们这时提出大O表示法

大O符号:是用于描述函数渐进行为的数学符号。

(2)大O阶方法的推导

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

当然,在某些算法的时间复杂度存在最好、平均和最坏的情况。
最好情况:任意输入规模的最小运行次数(下限)。
平均情况:任意输入规模的期望运行次数。
最坏情况:任意输入规模的最大运行次数(上限)。

在实际情况中,我们关注的一般是算法的最坏情况

四、空间复杂度

空间复杂度是什么?

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。

所以,空间复杂度算的是变量的个数

当然,计算空间复杂度时,我们使用的也是大O渐进表示法

相关文章:

  • 剑指offer-62-圆圈中最后剩下的数字
  • 【vue】vue3中状态管理Pinia(Vuex5)使用快速上手
  • Java序列化有什么作用
  • 【读书笔记】【Effective C++】构造/析构/赋值运算
  • Vue(四)——全局事件总线, 消息订阅与发布 ,nextTick
  • 【Java】Collection接口迭代器
  • 基于PID的直流电机调速控制系统
  • SSM+基于SSM的课堂考勤管理系统的设计与实现 毕业设计-附源码191617
  • SWUST OJ#99 欧几里得博弈
  • 基于Springboot+mysql的闲置二手交易网站系统设计
  • Code For Better 谷歌开发者之声 ——Tensorflow与深度学习
  • Web阶段一 静态网页
  • 第五章:数组、排序和查找
  • 香橙派 C# IOT .net 引用WiringOP操作引脚高电平低电平 代码实例
  • 高等数学(第七版)同济大学 习题7-7 个人解答
  • __proto__ 和 prototype的关系
  • Android Volley源码解析
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6--对象的扩展
  • Mocha测试初探
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Redis中的lru算法实现
  • storm drpc实例
  • SwizzleMethod 黑魔法
  • Vue ES6 Jade Scss Webpack Gulp
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从零开始在ubuntu上搭建node开发环境
  • 如何解决微信端直接跳WAP端
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 算法之不定期更新(一)(2018-04-12)
  • 一道闭包题引发的思考
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 移动端高清、多屏适配方案
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #Java第九次作业--输入输出流和文件操作
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***利用Ms05002溢出找“肉鸡
  • .axf 转化 .bin文件 的方法
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .CSS-hover 的解释
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 后台导出excel ,word
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET中GET与SET的用法
  • // an array of int