假期学习总结(25.2.19)
假期自习的最后一天。
这个假期学习的东西先罗列一遍,每个知识的掌握程度。
假期自习的其他收获和感想,之后学习的目标。
橙色表示题目重点
蓝色表示步骤
绿色表示重点
目录
1.dfs,bfs
2.并查集
3.队列
4.栈
5.二叉树
6.背包问题
7.前缀和数组,差分数组
8.java的基础语法
9.没学的,要补的
10.假期自习感想
学习的东西(顺序不是学习的先后顺序):
1.dfs,bfs
这里重点是讲bfs,因为之前一直没有搞明白,不明白它的解题思想是什么。
bfs和dfs的不同是bfs是一层一层的遍历搜索,而dfs是利用递归一搜到底再返回再搜。
看到很多博客在讲了bfs的思想之后,写的代码例子,模板都是C++搞的,所以还是有点不知道C语言的模板的具体代码,但是看了一个小破站的讲解视频,代码还是比较清晰的,距离拿捏bfs又近了一步...
bfs解题时,有三个重要的部分,一个是输入数组,其实也就是一个图。二是标记数组(bool类型)用来判断是否已经被查过,三是需要用队列来辅助实现bfs。
整体思路就是在构建的bfs函数中,标记顶点表示已经访问,然后再将顶点入队,再用一个while循环(循环条件是队列是否为空,如果是空的话就不进入循环),在while循环的内部:队头出队,再用一个for循环查找顶点的邻接顶点(判断条件是是否出界和是否被访问过),标记邻接顶点,再将邻接顶点统统入队。 然后就是再去上面的while循环。。。
2.并查集
这个知识我的印象特别深,感觉是学的最爽的一个数据结构的知识了,还得是一篇绝世好博客讲解的通透,再次摆出这位大佬写的超绝博客----->【算法与数据结构】—— 并查集-CSDN博客
并查集的重点部分也特别清晰。
首先,并查集有俩操作,一为合并,二为查询。
我们需要数组记录前驱节点,也可以形象化为老大,合并操作就是将需要合并的两个数的老大统一一下,查询就是找到这个数的老大。
查询就用一个find函数,基于当pre[ x ]==x的情况就代表找到老大,可以用一个while循环,一直往上一级查,直到找到最终的老大。这里还涉及到一个find函数的优化,就是实现路径压缩,降低时间复杂度,可以将往上查的路上的所有的节点的上一级直接设置为最终的老大,这样之后就不用再浪费时间继续一层一层往上查。
合并就是用一个join函数,分别将传入的数找到他们对应的老大(这里就可以直接用find函数),然后随机安排一个根节点为合并后的老大即可。
3.队列
队列的话,我只学了单调队列,还有其他的类型我并没有写过题目(加入后续学习计划)。
4.栈
利用栈去解决问题,重点部分就是栈的创建和栈指针(这里的栈指针也强调过很多次实际上不是实际意义上的指针),C语言的话,需要我们用数组去模拟一个栈,然后用栈指针,按照题目要求指向栈顶和栈底,方便操作。
这里有之前复习栈的时候自己写的总结,之后复习也非常方便:
25.2.3 【洛谷】作为栈的复习不错(学习记录)-CSDN博客
5.二叉树
二叉树我自己感觉写题目的时候比较难,基础的知识部分就是根,左子树,右子树。用C语言去构建一棵树的方法也是必备。需要动态为树分配空间。创建节点数组。用结构体构建一颗树类型,里面包含根节点,左子树,右子树的内容。
有两个我认为的二叉树的基础问题,一是求一颗二叉树的深度,二是将一颗二叉树按照前序(中序,后序)遍历并输出(只写过前序遍历,而且因为二叉树掌握的还不太熟练,写前序遍历的时候挺磕磕绊绊的,前序遍历用递归完成)。
这里是我自己写的一个C语言构建二叉树的模版:
二叉树实现(学习记录)-CSDN博客
6.背包问题
01背包,完全背包。(上次考试出的事部分背包和分组背包,完全不会,但是还没去补这方面的知识,划入学习计划。)
背包问题的核心是利用数组表示可以获得的最大价值(根据题目要求,也可能是其他含义,但其实都一样),核心的核心是找到正确的状态转移方程,我们可以根据两个状态每次会产生的情况去创建方程,放物品,不放物品每次价值有什么变化,我们最后需要的是这两种情况中能够得到的价值更大的那一种情况。
7.前缀和数组,差分数组
前缀和数组的作用其实就是保存了每个n的前n项和。差分数组的目的是为了方便区间整体连续的加减操作,更新正确的数值情况。
这俩弄的还是比较明白的,之前写的总结博客也写的比较清晰,复习自用:
【算法】并查集,前缀和数组,差分数组(学习记录)-CSDN博客
8.java的基础语法
之前的总结也有java语法的学习情况,不做详细总结,只举出这个学习内容。
9.没学的,要补的
看了一下算法书,桶排序这个东西还没搞过,还有最短路径好像也没搞过。
还没学完所有内容的:
二叉树
背包------>部分背包,分组背包
队列------->除了单调队列
排序-------->桶排序,快速排序
链表(这个好像没明白压根,老是将队列,栈,链表搞在一起)
10.假期自习感想
感觉收获还是蛮多的,其实一开始学数据结构真的觉得学不会,特别是写一个题目要写一晚上,写了又错,思路错了还好,多看看大佬的代码和思路(其实这个也很难,只不过至少有东西在那让我思考吧),如果是代码思路也是对的,就是个别地方错了,就要调试很久代码(当然这是在我没有ai检查代码问题之前,如果自己调试代码实在是搞不出来哪里错了,就会去问ai,之前还问老师,然后发现其实问代码细节错误,让别人找纯纯为难别人。。。)
感觉学数据结构最重要的就是了解为什么要用到这个数据结构解题,这个数据结构是怎么一个思路,最后才是怎么用代码实现思路。(明白逻辑思路之后,其实代码能很快理解,但其实两个结合起来学,好像学的更快。。。)
之后的学习目标自然是数据结构学透,赶课(java)
要开学了,加油加油!!!