寒假学习总结

目录

一、引言

寒假时间学习大致进度

二、学习内容概述

三、学习成果与收获

学习成果具体展现:

1.深搜广搜

2.栈

3.队列

4.链表

5.动态规划

6.并查集

7.记忆化搜索

8.二叉树

9.图

10.堆

11.寒假部分收录完成题目(少数没有收录)

四、反思与展望

五、结语


一、引言

寒假时间学习大致进度

由期末还未深入学习的深搜,广搜 敲开了寒假自习的大门。在接下来的这段时间,我先从基础的栈,队列和链表 入手,逐渐摸索学习。向更加复杂的算法前进,掌握了动态规划 的核心思想。年后又开始深入学习二叉树,图以及堆

二、学习内容概述

**这段时间我主要学习数据结构与算法。**而数据结构与算法不仅是编程的基石,更是培养编程思维的关键。它们教会我们如何高效地组织和管理数据,如何分析问题并选择最合适的解决方案。通过运用数据结构与算法,我们能够锻炼出抽象思考、逻辑分析和问题解决的能力,这些都是编程思维的核心要素。因此,深入理解和掌握数据结构与算法,不仅是为了提升程序的性能,更是为了培养出优秀的编程思维。

三、学习成果与收获

学习成果具体展现:

1.深搜广搜

深度优先搜索(DFS, Depth-First Search)和广度优先搜索(BFS, Breadth-First Search)都是用于遍历或搜索树或图的算法。它们的核心区别在于访问节点的顺序和方式。

深度优先搜索(DFS)

  • DFS是一种用于遍历或搜索树或图的算法。
  • 它从图的某一节点(源节点或根节点)出发,访问该节点的所有未访问的相邻节点中的一个,然后对这些相邻节点执行相同的操作,直到所有节点都被访问过。
  • DFS使用栈(Stack)数据结构来辅助实现,按照"后进先出"(LIFO)的原则进行节点的访问。
  • DFS在搜索过程中,每个节点只访问一次,因此它是一种不重复、不遗漏的搜索算法。

深度优先搜索题目(DFS)-CSDN博客

广度优先搜索(BFS)

  • BFS也是一种用于遍历或搜索树或图的算法。
  • 它从图的某一节点(源节点或根节点)出发,首先访问该节点的所有未访问的相邻节点,然后对这些相邻节点执行相同的操作,直到所有节点都被访问过。
  • BFS使用队列(Queue)数据结构来辅助实现,按照"先进先出"(FIFO)的原则进行节点的访问。
  • BFS在搜索过程中,会逐层访问节点,先访问离源节点近的节点,再访问离源节点远的节点。

这两种搜索算法在不同的应用场景中有各自的优势。例如,DFS在求解图的连通性、寻找图的路径等问题中表现出色,而BFS在求解最短路径、层次遍历等问题中更为适用。

广度优先搜索(BFS)题目-CSDN博客

2.栈

栈(Stack)是一种线性数据结构,其特点是只允许在一端(称为栈顶)进行插入和删除操作,而另一端(称为栈底)则保持固定。栈遵循"后进先出"或"先进后出"的原则,即最后加入栈的元素将是最先被移除的元素。

栈的基本操作包括入栈(Push,将元素添加到栈顶)、出栈(Pop,从栈顶删除元素)、查看栈顶元素(Peek或Top,返回栈顶元素的值但不删除它)以及判断栈是否为空(Is Empty)。

栈可以用数组或链表来实现。数组实现的栈需要事先定义栈的大小,而链表实现的栈则可以动态地分配内存。此外,栈还可以扩展为具有其他功能的数据结构,如求栈中最小值、判断括号匹配等。

栈的实现及注意事项-CSDN博客

栈的实现从入门到熟练(题目练习)-CSDN博客

3.队列

队列是一种特殊的线性表,它只允许在表的前端(称为队头)进行删除操作,而在表的后端(称为队尾)进行插入操作。这种操作受限制的线性表遵循先进先出(FIFO, First In First Out)的原则,即最早进入队列的元素将是最早被删除的元素。

队列的基本操作包括队列初始化、判断队空、入队操作、出队操作、读取队头元素和销毁队列等。队列可以通过数组或链表来实现,基于数组实现的队列称为顺序队列,而基于链表实现的队列称为链式队列。

队列的实现及注意事项-CSDN博客

4.链表

链表是一种数据结构,它的特点在于数据元素在物理存储单元非连续、非顺序,而是通过链表中的指针链接次序实现数据元素的逻辑顺序。链表由一系列节点组成,每个节点包含两部分:数据域和指针域。数据域用于存储数据元素,而指针域则存储指向下一个节点的地址。

链表的主要优点在于其动态性和灵活性。链表可以在运行时动态生成节点,无需预先分配内存空间,因此可以充分利用计算机内存空间,实现灵活的内存动态管理。此外,链表的插入操作较快,可以达到O(1)的复杂度,比另一种线性表顺序表快得多。

然而,链表也有一些缺点。首先,链表失去了数组随机读取的优点,访问特定编号的节点需要从头节点开始依次遍历,直到找到目标节点,时间复杂度为O(n)。其次,由于每个节点都需要存储指向下一个节点的指针,因此链表的空间开销比较大

总的来说,链表是一种非常有用的数据结构,特别适用于需要动态添加和删除元素的情况。然而,由于其随机访问效率较低和空间开销较大,在选择使用链表还是其他数据结构时,需要根据具体的应用场景和需求进行权衡。

基础链表代码实现-CSDN博客

5.动态规划

动态规划的核心思想是将原问题拆分成多个子问题,先解决子问题,然后综合这些子问题的解来得到原问题的解。在解决每个子问题时,动态规划会存储这个子问题的解,以便在解决后续子问题时可以利用这些已存储的解,从而避免了重复计算。这种方法在处理具有重叠子问题和最优子结构性质的问题时特别有效。

动态规划算法的基本步骤包括:

  1. 定义问题的状态:确定描述问题的变量,即状态。
  2. 列出状态转移方程:描述由当前阶段的状态和决策如何确定下一个阶段的状态。
  3. 求解最优值函数:通过逐步求解子问题的最优解,最终得到原问题的最优解。

与分治算法类似,动态规划也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。但不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的,下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解。

动态规划基础概念-CSDN博客

动态规划背包问题-CSDN博客

6.并查集

并查集(Union-Find)是一种用于处理一些不相交集合(Disjoint Sets)的合并及查询问题的数据结构。这种数据结构常常以森林的形式来表示。

并查集有两个主要操作合并(Union)和查找(Find)。合并操作是将两个集合合并成一个集合,查找操作是查询一个元素属于哪个集合。这两个操作都可以通过树形结构来实现。

在初始化时,每个元素都作为一个独立的集合,即每个元素的父节点都是它自己。合并操作时,我们需要找到两个元素的根节点(即集合的代表元素),然后将其中一个根节点的父节点设置为另一个根节点,表示将这两个集合合并成一个集合。查找操作时,我们从指定的元素开始,不断查找其父节点,直到找到根节点为止。这个根节点就是该元素所在的集合的代表元素。

并查集总结-CSDN博客

7.记忆化搜索

记忆化搜索(Memory search)是一种通过记录已经遍历过的状态的信息,从而避免对同一状态重复遍历的搜索实现方式。具体来说,它是一种结合搜索和动态规划思想的算法策略,旨在提高算法效率。在记忆化搜索中,对于已经计算过的状态,将其结果保存下来,以便在后续的计算中可以直接使用,而不需要重新进行计算。这样可以避免大量的重复计算,达到时间复杂度上的优化。

记忆化搜索-CSDN博客

8.二叉树

二叉树(Binary Tree)是一种特殊的树形结构,具有以下基本知识和特性:

  1. 定义:二叉树是每个节点最多有两个子树的树结构,通常子树被称作"左子树"和"右子树"。
  2. 基本形态
    • 空二叉树:没有节点的二叉树。
    • 只有一个根节点的二叉树
    • 只有左子树的二叉树。
    • 只有右子树的二叉树。
    • 既有左子树又有右子树的二叉树。
  3. 特殊类型的二叉树
    • 满二叉树:除最后一层外,每一层上的结点数都达到最大个数的二叉树。
    • 完全二叉树:除最后一层外,其他各层的结点数都达到最大个数,且最后一层的结点都集中在该层最左边的若干位置上的二叉树。
  4. 性质
    • 性质1:二叉树第i层上的结点数目最多为2^(i-1)(i>=1)。
    • 性质2:深度为k的二叉树至多有2^k - 1个结点(k>=1)。
    • 性质3:包含n个结点的二叉树的高度至少为log2(n+1)。
    • 性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。
  5. 节点和路径
    • 节点:二叉树中的一个元素。
    • 路径:从根节点到任一节点的序列。
    • 路径长度:路径上经过的节点数。
    • 树的深度:根节点到最远叶子节点的最长路径长度。
    • 树的高度:根节点到最远叶子节点的最短路径长度。

二叉树基础总结-CSDN博客

9.图

数据结构中的图(Graph)是一种非线性数据结构,由节点(或顶点,Vertex)和边(Edge)组成。节点表示数据对象,而边表示节点之间的关系。与树形结构不同,图结构中的节点可以有多于一个的前驱节点和后继节点。

图的基础知识包括以下几个方面:

  1. 图的定义:图是由节点和边组成的集合。边可以是有向的(有向图),也可以是无向的(无向图)。在有向图中,边表示从一个节点到另一个节点的有向关系;而在无向图中,边表示两个节点之间的无向关系。

  2. 图的表示:图通常可以使用邻接矩阵、邻接表、边列表等方式进行表示。邻接矩阵是一个二维数组,用于表示节点之间的连接关系;邻接表则是一个数组或链表,用于存储每个节点的邻居节点;边列表则直接列出图中的每条边。

  3. 图的遍历:图的遍历是指访问图中的每个节点,并确保每个节点只被访问一次。常见的图遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。DFS从某个节点出发,尽可能深地搜索图的分支,直到达到目标节点或无法继续深入;BFS则从某个节点出发,逐层访问邻居节点,直到访问完所有节点。

图的基础总结-CSDN博客

10.堆

堆(Heap)是计算机科学中的一种特殊数据结构,通常被看作是一棵完全二叉树。这种数据结构有两个主要的特性:

  1. 堆中的每个节点都满足堆的性质,即对于任意节点,其值(称为键)要么大于等于(在最大堆中)要么小于等于(在最小堆中)其子节点的值。
  2. 堆总是以数组的形式存储,这样可以利用数组索引的特性来快速访问父节点和子节点。

堆常用于实现优先队列,因为它能快速地访问最高或最低优先级的元素。此外,堆也是堆排序算法的基础,这是一种高效的排序算法。

堆的初级理解-CSDN博客
优先队列的实现-CSDN博客

11.寒假部分收录完成题目(少数没有收录)

四、反思与展望

预备役的学习比我想象的还要艰难。在这一个月里,我曾经面临过题目写不出的苦恼,知识点看不懂的无奈,学习状态不佳、无法进入的急躁,以及每一次测试不理想的结果带来的挫败,让我有了一种梦回高三的错觉。我整体的状态可以用一个字来形容,那就是""。

从最开始的学习说起吧。实验室自习时间是1月25日开始,但其实在此之前我便已经开始投入学习了。从1月22日开始,我每天都有保持四小时的自习时间,聊胜于无嘛。那一天我发布了第一篇博客《广度优先搜索》。在期末将近的时候,我第一次接触深搜,广搜,被他们巧妙的过程所吸引。所以在考试结束后,我便愉快的投入深搜广搜的学习,这一学便是一个星期。25日的自习也悄然无声的开始了。值得高兴的是在公布的第一周提单了出现了很多与搜索有关的题目。但好像令人高兴的也只有这一点了,因为当我解决完所有与搜索有关的题目的时候,我发现离提单截止的时间不过四天了。四天看上去比较长,但实际上在我看来它却是生死时速,因为我忽略了一个很重要的点,那就是我对于指针的学习并没有很深入。看着熟悉而又陌生的栈和队列,我陷入了一丝丝的尴尬。栈和队列的特点的确很简单,一句话就可以概括。但是实现的过程却让我有点吃力。当然,在学习搜索内容的同时,我也有学习新的知识点,但是那些都是数据结构与算法之间的概念。也就是数据结构最最基础知识点梳理总结-CSDN博客数据结构与算法关系(基础总结)-CSDN博客。我明白三尺之冻非一日之寒,指针的学习并不能够一日千里,没法速成,这让我很苦恼。事到如今,叹气也没有任何的用处了,只能咬着牙齿硬着头皮顶上去了。我上"B站"下"CSDN";左翻红色教材书右问人工智能。终于的终于学会了栈的实现。队列也同样如此。后来,在大家的帮助下,我学会了用C++的STL容器实现栈和队列。学会这些的我,成就感满满。第一周测试如约而至,上面的题目不能说很难,但是也没有那么简单。在这里面,我接触到了记忆化搜索和KMP。KMP的学习(未加题目版)-CSDN博客考试结束后,我去查阅了记忆化搜索和KMP相关方面的知识点。我感觉每周题单和测试就像一只无形的手掌,推着我前进。今天总是过得很快,第一周就这样结束了。第二周我又看到了新的知识点------动态规划。动态规划的思想并没有那么简单,他其实考验的是思维能力。题单的数量多,测试的题目也出了补题,这些让时间本就不富裕的我更加捉襟见肘。导致我心有余而力不足,并没有那么多独立思考的时间去逐个击破题目,独立思考的时间被逐渐压缩,渐渐的我更多的时间用在看题解。我并没有说看题解有什么不好的,但是我觉得这种环境下,写出来的题目总还是少了些东西。我想可能是灵魂吧。后来,过年了。我放下了学习。

年后要检查栈,队列和链表的实现。这无疑又唤醒了我尘封的记忆------指针。因为,链表我还不会。于是,在正月初4我又拿起了武器,开始驰骋沙场。几天后,又开始集体自习了,这一次我的视线转向了树和图。树和图的学习相对较为轻松,因为与之挂钩的链表我已经学会了。可想而知,我的自信心又上来了。

但现实总喜欢在人得意的时候给人一个大逼兜。第三次测试我拿下了倒数第二名......

或许沉默才是最好的语言......

哈,我可没那么悲观。心情不好的确是在所难免的,但放弃可不是我的性格。只要每天都在学,就会有一个好的结果。好了好了,回归正题,在考完那天我花了一个小时思考加反省。总结出来的精华:1.学习急于求成只会适得其反。哈哈,我就是学太快了,有些细节没有把握住。2.实力是在题目练出来的,只看不练不会有好结果。有一段时间把练习的效果等同于看学习视频,找资料的效果,本末倒置了。3.思考为主,题解为辅。

时间差不多了,寒假自习也快结束了。

五、结语

不管结果如何我都曾努力过,不后悔就行。加油~

相关推荐
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
dayouziei4 小时前
java的类加载机制的学习
java·学习
wheeldown6 小时前
【数据结构】选择排序
数据结构·算法·排序算法
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画8 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
城南vision8 小时前
Docker学习—Docker核心概念总结
java·学习·docker
ctrey_9 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
十年之少9 小时前
由中文乱码引来的一系列学习——Qt
学习
躺不平的理查德10 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain10 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法