数据结构与算法简介,Leetcode入门及攻略

  • 1. 数据结构与算法
    • 1.1 相关定义
    • 1.2 为什么要学习算法和数据结构
    • 1.3 数据结构
      • 1.3.1 数据的逻辑结构
      • 1.3.2 数据的物理结构
    • 1.4 算法
      • 1.4.1 算法的基本特性
      • 1.4.2 算法追求的目标
  • 2. 算法复杂度
    • 2.1 时间复杂度
      • 2.1.1 渐进符号
      • 2.1.2 时间复杂度的计算
      • 2.1.3 最佳, 最坏,平均时间复杂度
    • 2.2 空间复杂度

1. 数据结构与算法

数据结构是程序的骨架,而算法则是程序的灵魂

1.1 相关定义

  1. 算法(Algorithm): 解决问题的方法或过程
  2. 数据结构(Data Structure): 数据的计算机表示和相应的一组操作
  3. 程序(Program): 算法和数据结构的具体实现

以做菜举例: 把程序设计比作做菜,那么数据结构就是食材和调料,算法则是不同的烹饪方式,有着不同的组合

1.2 为什么要学习算法和数据结构

在程序设计中,对于待解决的问题,我们追求的是:选择更合适的数据结构,使用花费时间更少,占用空间更小的算法

1.3 数据结构

数据结构(Data Structure): 数据的组织结构,用来组织, 存储数据

  1. 研究内容:数据结构研究的是数据的逻辑结构,物理结构以及它们之间的相互关系,并对这种结构定义相应的运算,设计出相应的算法,并确保经过这些运算之后所得到的数据结构仍保持原来的数据类型
  2. 作用:提高计算机硬件的利用率

1.3.1 数据的逻辑结构

逻辑结构(Logical Structure):数据元素之间的相互关系

  1. 集合结构:数据元素同属于一个集合,除此之外无其他关系
  2. 线性结构:数据元素之间是一对一的关系
  3. 树形结构:数据元素之间是一对多的层次关系
  4. 图形结构:数据元素之间是多对多的关系

1.3.2 数据的物理结构

物理结构(Physical Structure):数据的逻辑结构在计算机中的存储方式

  1. 顺序存储结构(Sequential Storage Structure):将数据元素存放在一片地址连续的存储单元里,数据元素之间的逻辑关系通过数据元素的存储地址来直接反映
    **注意:在顺序存储结构中,逻辑上相邻的数据元素在物理地址上也必然相邻 **

    • 优点:简单, 易理解,实际上占用最少的存储空间
    • 需要占用一片地址连续的存储单元;存储分配要事先进行;对于一些操作的时间效率较低
  2. 链式存储结构(Linked Storage Structure):将数据元素存放在任意的存储单元里,存储单元可不连续
    注意:链式存储需要指针

    • 优点:存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间的浪费;一些操作的时间效率远比顺序存储结构高
    • 缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链式存储结构比顺序存储结构的空间开销大。

1.4 算法

算法(Algorithm):解决特定问题求解步骤的准确而完整的描述,在计算机中表现为一系列指令的集合,算法代表着用系统的方法描述解决问题的策略机制
算法,就是指解决问题的方法

1.4.1 算法的基本特性

  1. 输入:对于待解决的问题,都要以某种方式交给对应的算法。在算法开始之前最初赋给算法的参数称为输入。
  2. 输出:算法是为了解决问题存在的,最终总需要返回一个结果。所以至少需要一个或多个参数作为算法的输出。
  3. 有穷性:算法必须在有限的步骤内结束,并且应该在一个可接受的时间内完成。
  4. 确定性:组成算法的每一条指令必须有着清晰明确的含义,不能令读者在理解时产生二义性或者多义性。就是说,算法的每一个步骤都必须准确定义而无歧义。
  5. 可行性:算法的每一步操作必须具有可执行性,在当前环境条件下可以通过有限次运算实现。也就是说,每一步都能通过执行有限次数完成,并且可以转换为程序在计算机上运行并得到正确的结果。

1.4.2 算法追求的目标

总体目标

  1. 所需运行时间更少 (时间复杂度更低)
  2. 占用内存空间更小 (空间复杂度更低)

但在实际中,兼顾时间复杂度和空间复杂度的算法是不存在的,这时我们需要结合自己具体的情况,采取以空间换时间或者以时间换空间的策略
但一个好的算法还应该追求以下目标:

  1. 正确性:算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。
  2. 可读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当,方便自己和他人阅读,便于后期修改和调试
  3. 健壮性: 算法对非法数据以及操作有较好的反应和处理

2. 算法复杂度

算法复杂度(Algorithm complexity): 在问题的输入规模为 n 的条件下,程序的时间使用情况和空间使用情况
比较算法优劣的两种方法:

  1. 事后统计:将两个算法各编写一个可执行程序,交给计算机执行,记录下各自的运行时间和占用存储空间的实际大小,从中挑选出最好的算法
  2. 预先估算:在在算法设计出来之后,根据算法中包含的步骤,估算出算法的运行时间和占用空间。比较两个算法的估算值,从中挑选出最好的算法

一般选择第二种方式,第一种方式的工作量太大
在第二种方式下, 我们只关心随着问题规模 n 扩大时,时间开销、空间开销的增长情况。
问题规模n:算法问题输入的数据量大小.对于不同的算法,定义也不相同

  • 排序算法中:n 表示需要排序的元素数量。
  • 查找算法中:n 表示查找范围内的元素总数:比如数组大小、二维矩阵大小、字符串长度、二叉树节点数、图的节点数、图的边界点等。
  • 二进制计算相关算法中:n 表示二进制的展开宽度。

2.1 时间复杂度

时间复杂度(Time Complexity):在问题的输入规模为n的情况下,算法运行所需要花费的时间,可以记作T(n)

度量标准:基本操作次数
基本操作:算法执行中的每一条语句

2.1.1 渐进符号

渐进符号实际上是专门用来刻画函数的增长速度的。
只保留最高次幂(在问题规模很大时,其余部分并不会造成太大影响)
最常用的为下面这种

2.1.2 时间复杂度的计算

  1. 找出算法中的基本操作(基本语句):算法中执行次数最多的语句就是基本语句,通常是最内层循环的循环体部分。
  2. 计算基本语句执行次数的数量级:只需要计算基本语句执行次数的数量级,即保证函数中的最高次幂正确即可。
  3. 用大O表示法表示时间复杂度:将上一步中计算的数量级放入 O 渐进上界符号中。
  • 加法原则:总的时间复杂度等于量级最大的基本语句的时间复杂度
  • 乘法原则:循环嵌套代码的复杂度等于嵌套内外基本语句的时间复杂度的乘积

2.1.3 最佳, 最坏,平均时间复杂度

  • 最佳时间复杂度:每个输入规模下用时最短的输入对应的时间复杂度
  • 最坏时间复杂度:每个输入规模下用时最长的输入对应的时间复杂度
  • 平均时间复杂度:每个输入规模下所有可能输入对应用时平均值的复杂度(随机输入下期望用时的复杂度)。

2.2 空间复杂度

空间复杂度(Space Complexity):在问题的输入规模为n的条件下,算法所占用的空间大小,可以记作为 S(n)。一般将算法的辅助空间 作为衡量空间复杂度的标准
空间复杂度与时间复杂度有许多共通之处,就不再过多赘述.
算法所需空间主要有两个方面:

  1. 局部变量(算法范围内定义的变量)所占用的存储空间
  2. 系统为实现递归(如果算法是递归的话)所使用的堆栈空间

链接: DataWhale算法通关手册.

2021-11-15 数据结构与算法简介相关推荐

  1. (一)数据结构与算法简介

    数据结构与算法简介 目标 掌握数据结构与算法的理论知识 补齐算法短板 梳理前端与算法结合点,不再纸上谈兵,将算法用于实战 三部曲 理论:数据结构与算法的特点.应用场景等等 刷题:做一些算法题,推荐使用 ...

  2. 算法与数据结构(part1)--算法简介及大O表示法

    学习笔记,仅供参考 文章目录 算法与数据结构--基于python 数据结构和算法简介 算法引入 例题A 算法的概念 例题A的优化 算法效率的衡量 时间复杂度与大O记法 例题A的时间复杂度 如何理解大O ...

  3. 原创文章侵权检测功能开放白名单,欢迎大家申请试用;APP端签到功能重新上线,奖励加倍【2021.11.15】

    hello,大家好,这里是「CSDN产品周报」第18期.本次更新主要涉及首页.创作中心.APP 三个产品模块,具体细节请往下看. 一.首页优化 1.首页的热榜.专业榜.悬赏榜融合为「新热榜」信息流 2 ...

  4. 程序员的进阶课-架构师之路(1)-数据结构与算法简介

    现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处.这也是我写这些博客的初衷,我会讲解java实现的数 ...

  5. 【数据结构与算法——C语言版】1. 数据结构与算法简介

    概念 数据结构:"一组数据的存储结构" 算法:"操作数据的一组方法" 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 简言之,在编程实践中,我们可能 ...

  6. 2021.11.15表演节目事件

    表演节目事件 ① 在刚刚进入初中后,郑老师就对我们施行了小组加分制度.八个小组中前三名的组可以获得太阳.月亮.星星.大家表现得都很积极,回答问题的积极性直线型上升,经常出现"群芳竞艳&quo ...

  7. 第二次尝试修复Hbase2出现Region不一致,使用 HBCK2 - 2021.11.15

    spark任务中入hbase任务全部失败了,查看日志发现hbase出现问题 报错日志: 在hbase的log中看到报错 Call queue is full on xxxx,16000,1611197 ...

  8. 2021/11/15

    问题1.关联关系. 使用 Preload("Supplier")前,必须在models层面添加关联关系 Suppliers []SysSupplier `gorm:"ma ...

  9. 随手研究一个项目里的坦克履带——项目开发日志(2021.11.15)

    文章目录 前言 笔记: 坦克履带 车辆AI 前言 这几周我在一个新的UE4项目中做实现,正好这个项目中有AI车辆和坦克,拿来研究一下.我也不透露项目具体内容,应该不会被告吧. 笔记: 坦克履带 这个游 ...

最新文章

  1. ping连接linux无法访问目标主机,无法访问目标主机是什么情况【解决方法】
  2. 格瑞光电:智慧城市建设的引领者
  3. 下一代视频编码技术的云视频应用探索
  4. 黑客攻防:从入门到入狱_每日新闻摘要:游戏服务黑客被判入狱27个月
  5. 小程序 - 学习笔记
  6. mysql数据库修改数据库名称_MySQL数据库之MySQL 修改数据库名称的一个新奇方法...
  7. Maven 单独构建多模块项目中的子模块
  8. [Java] 蓝桥杯ALGO-80 算法训练 整数平均值
  9. 掌握这些的Linux命令,你基本稳了
  10. JSP自定义标签_属性接收复杂类型处理方式
  11. NuGet无法下载的问题
  12. 几款常用的Git图形化工具
  13. 2021年低压电工新版试题及低压电工考试总结
  14. linux服务器默认多久断开ssh,SSH超时自动断开问题解决
  15. 目标检测之CSK(Exploiting the Circulant Structure of Tracking-by-detection with Kernels)
  16. 最全大数据就业前景分析!此篇文章给你答案
  17. 橙色云构建研发协同生态链,助力企业降本增效
  18. 纪念海子离去20周年
  19. 灵活提取Excel数据工具
  20. python:tkinter —— Tcl/Tk 的 Python 接口

热门文章

  1. 打造自己的天气预报之(六)——对数据库的操作
  2. python使用redis缓存数据库
  3. 10大Web漏洞扫描工具
  4. 第22天 Binary Tree 235、701、450
  5. 拉卡拉支付瞄准线下蓝海持续创新
  6. idea java连接MongoDB(1)——前置配置
  7. SCI写作【Machine learning and Deep learning】
  8. 互联网直播手机、电脑投屏无线同屏直播版软件之LibEasyScreenLive如何实现屏幕鼠标采集
  9. 幽灵按钮html,什么是幽灵按钮?网站设计用户体验
  10. Ant Design Vue 新手入门使用教程