408数据结构复习

  1. 不同类型的数据,采用不同的结构,可以提高编程效率。没有完美的数据结构,只有最合适的数据结构。
  2. 编程题=理论知识+算法逻辑
  3. 好的复习习惯:记笔记,分为两部分,一部分是理论知识总结的重要部分,一部分是优秀编程题;每周回顾一次
  4. 总的印象:感觉每个知识点虽然印象不深了,但是可以确定当时学习的时候基本每个知识点都是理解和掌握的,理论知识应该会很流畅。

第一阶段复习:

  1. 目标:理解每个知识点,刷每道王道书的题目(选择+大题),标注重难点、错题原因。
  2. 数据结构意义:用程序代码将现实世界信息化-表示、高效处理信息

绪论

  1. 信息化世界:
    在这里插入图片描述
  2. 数据结构三部分:逻辑结构、数据运算、存储结构;逻辑结构、数据结构定义了一个数据结构;存储结构实现一个数据结构。有关概念:
    在这里插入图片描述
  3. 1.1总结:讲述了多个概念的关系,着重掌握了数据对象的概念;理清了数据结构三大要素:逻辑结构、存储结构、数据运算;学习了答题的规范性。
  4. 程序=数据结构+算法 (良好表示+高效计算),算法是基于某些数据结构的
  5. 1.2总结:
    学习了算法的特性、什么是好的算法
    关于算法时间复杂度的计算,“常对幂指阶”的常见复杂度大小;
    一般要考虑算法最坏、平均时间复杂度(与数据的性质有关)(因为以后程序员的工作是面向商业化的,只有这两个时间复杂度具有实际意义);
    学习了算法的空间复杂度,主要分为普通程序和递归调用程序,分析方法:直观化地画一个内存框

第二章:线性表

  1. 2.1总结学习了线性表的逻辑结构、相关概念、常用操作、为什么要用数据结构封装操作,重点掌握了引用符号的含义
  2. 2.2.1讲解了顺序表的初始化(顺带讲了脏数据),顺序表的静态分配、动态分配、顺序方式实现的线性表优点是访问速度、存储密度,缺点是增删和扩容不方便
  3. 2.2.2讲解了线性表的插入和删除以及它们的时间复杂度,注意点是:健壮性检测;插入是从后面开始移动,删除是从前面开始移动;区分位序与数组下标;&;此外还学习了按值查找、按位查找(O1)及时间复杂度(若顺序表的元素按特殊顺序排放,按值查找效率会提高)
  4. (1)2.3讲了链表(有头结点、没用头结点),平时使用带头结点的,编程更方便,别名的意义;
    (2)学习了单链表的插入和删除,分为按位插入、删除(O(n)),按指针插入、删除(分别介绍了O(1)和O(n)的算法,其中删除的O(1)算法,在删除末尾节点的时候有bug),以后默认用带头节点的链表实现方式(不带头结点,需要对第一个结点进行特殊处理);
    (3)学习了单链表按位、按值查找,求单链表长度,核心都是一个循环,因此是O(n)复杂度;
    (4)学习了单链表初始化、指定节点后插操作这两个基本操作,以及运用这两个基本操作的核心思想,迁移到单链表的建立中(头插法和尾插法,指定节点分别是:头结点、指向标为的指针结点),以及注意头插法的一大应用:链表倒置,以后注意对数据结构基本思想的迁移应用
    (5)学习了双链表,其插入、删除结点指针修改的顺序(不管是前插还是后插,本质只需要使用后插就可以实现;前删,后删,只需要用后删),注意插入、删除的边界情况:最后一个结点处
    (6)讲解了循环双链表、循环单链表,循环这个属性,就基本让每个结点处于等同的地位下,边界情况往往就不需要特殊对待了。代码的关键三个问题:
    在这里插入图片描述
    知道如何判空,就知道怎么初始化;知道如何判断表头表尾,就抓住了前向、后向遍历的核心。
    (7)讲解了静态链表:其主要意义是:在不支持指针的语言低级语言中,实现类似单链表的逻辑功能,以及运用在元素量固定不变的场景(如操作系统的文件分配表FAT
    (8)系统总结了第二章线性表的内容:从逻辑的角度,顺序表和链表都是线性表;从存储结构角度,分别是数组存和申请动态空间存,其中顺序结构分为静态数组和动态数组(静态链表这里不讨论);从基本操作来看,顺序表更适用于容量稳定,查询操作更多的情况,链表更适合增删操作更多、弹性需求大的情况

第三章 栈和队列

  1. 首先学习了栈的逻辑结构,主要特点是LIFO,找到了合适的方法,记忆栈顶就是最上面的TOP,也是最先被删除和插入的地方
  2. 学习了顺序栈的实现,根据top的初始值为0/-1,讲解了两种实现方式,一些不同点;介绍了共享栈。
  3. 链式栈,push的时候,就像是链表中的头插法,pop就像是限定链表从头删除。给别人讲解,就是训练自己输出的好方法,值得推荐。
  4. 队列的定义、基本操作,是一种操作受限的线性表,操作很相似,操作的名称是:入队、出队。
  5. 顺序栈的实现。由于数组和队列的逻辑性质,导致为了使用顺序队列,几乎必然要采用循环队列的方式才能减少内存浪费。在顺序循环队列的实现中,有两个要点:队尾指向最后一个元素,还是最后一个元素的下一个元素?检测队满的方法是什么:牺牲一个存储单元、size、tag
    在这里插入图片描述
  6. 学习了带头结点和不带头结点的链式队列,不带头结点的时候,入队、出队操作在队列为空的情况下,rear指针需要特殊处理。数据结构不是教条化的东西,无论是考试、开发,都可以根据实际的需要自己调整所使用的数据结构
  7. 栈的变种是共享栈,学习了队列的变种:双端队列,主要从逻辑上给我们分析了能够输出的序列顺序,首先肯定栈能输出的序列,双端队列一定能输出。复习了卡特兰数。分输入、输出受限的双端队列讲解。输入受限,根据输出顺序,可以得到必然在栈中的元素,然后尝试通过从两端输出的组合,拼凑出输出的结果;输出受限,则可以根据输出顺序的总体顺序,先在队列中得到输入,再尝试通过两端的输入,拼凑出这个输入。如果不能,则无法得到该输出顺序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值