「笔记」数据结构与算法之美 - 入门篇

为什么要学

  • 掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的
  • BadCase:经历项目很多,但每个项目都是重复地堆砌业务逻辑而已,完全没有难度递进,看不出有能力提升
  • 目的
    • 建立时间复杂度、空间复杂度意识
    • 写出高质量的代码
    • 能够设计基础架构
    • 提升编程技能
    • 训练逻辑思维
    • 积攒人生经验
  • 掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样
  • 精选留言(为什么学习数据结构和算法?我认为有3点比较重要)
    • 直接好处是能够有写出性能更优的代码
    • 算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面
    • 长期来看大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一

如何高效学习

  • 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法

  • 数据结构是为算法服务的,算法要作用在特定的数据结构之上

  • 学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力

    img

    • 最常用的10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
    • 最常用的10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
    • 要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”
  • 学习技巧

    • 边学边练,适度刷题
    • 多问、多思考、多互动(组队学习,效果佳
    • 打怪升级学习法(坚持下来、给自己设立一个切实可行的目标
    • 知识需要沉淀,不要想试图一下子掌握所有(学习知识的过程是反复迭代、不断沉淀的过程

复杂度分析(上)

  • 复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半

  • 为什么需要复杂度分析

    • 测试结果非常依赖测试环境
    • 测试结果受数据规模的影响很大(不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法
  • 大 O 复杂度表示法

    • 大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势
    • 大 O 复杂度表示法也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度
  • 时间复杂度分析

    • 只关注循环执行次数最多的一段代码
      • 我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以
    • 加法法则:总复杂度等于量级最大的那段代码的复杂度
    • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
  • 几种常见时间复杂度实例分析
    img

    • 我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2n) 和 O(n!)
    • 常见的多项式时间复杂度
      • O(1):只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)
      • O(logn)、O(nlogn):对数阶时间复杂度非常常见,归并排序、快速排序的时间复杂度都是 O(nlogn)
      • O(m+n)、O(m*n):代码的复杂度由两个数据的规模来决定
  • 空间复杂度分析

    • 空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系
    • 常见的空间复杂度就是 O(1)、O(n)、O(n2),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到
  • 复杂度分析并不难,关键在于多练

    img

复杂度分析(下)

  • 最好、最坏情况时间复杂度

    • 最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度
    • 最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度
  • 平均情况时间复杂度

    • 平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度
  • 均摊时间复杂度

    • 摊还分析法,通过摊还分析得到的时间复杂度叫均摊时间复杂度
      • 同时,均摊时间复杂度就是一种特殊的平均时间复杂度
    • 在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上,基本上均摊结果就等于低级别复杂度。
    • 使用均摊时间复杂度的条件
      • 代码在绝大多数情况下是低级别复杂度,只有极少数情况是高级别复杂度
      • 低级别和高级别复杂度出现具有时序规律
发布了98 篇原创文章 · 获赞 197 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/YangDongChuan1995/article/details/104578312