大一c语言知识点总结树状图,AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点!...

原标题:AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点!

a36c31eb6d17e9887f9729f73553c7c0.png

这是 北航士谔书院的第 1482篇推送

经过寒假的预习

你一定对 春季学期的课程

有了十足的底气和信心了吧?

你心目中最简单的课程是哪一门呢?

是不是 数据结构与程序设计?

7cbaf190580f40693ac828bf377d5381.png

4a4f26539624b5df96951767f4ece46d.png

怎么可能……

004688789804d0f322fa5ae6ba2df785.png

士小信你别着急呀,我有一个好东西要送给你。

c000bcd4ce55d69131bccdcf5a7ce69e.png

呐,这里有一份 AK宝典,都是学长满满的 经验干货!

太好啦!感谢!萱鸽儿yyds!

快和 士小信一起来看看

萱鸽儿给的武功秘籍吧~

ba0901f4282afcd2143b29d64d14b7c6.png

12cf0b357b86e6760d33b71cfc250438.png

陈 昊

士谔书院2019级 计算机学院

数据结构与程序设计满分

总体感受

2019.10.10开始接触的C语言,学程设的时候刷OJ遇到过少量涉及队/栈/二叉堆的题目,因此提前了解过一点这方面的内容,此外寒假把 《啊哈算法》刷了两遍,勉强算有点基础吧。

1585cf87616ccc294c3d1a2e4e31405c.png

个人认为数据结构在对知识和能力的要求上比程设更进一步,但在课上内容却比程设轻松,我个人大一上每周为了搞定上机题和练习题投入了相当多的时间,但大一下数据结构的作业我基本没有让它隔夜过,发布之后短则两三个小时,长则四五个小时就AK完了,之后就去研究研究大作业/进行一些拓展学习了。

数据结构这一块给我的感受是学的比较浅,比如不会涉及树状数组和线段树,不会涉及二叉树的删除,不会涉及平衡二叉树,图的部分最小生成树的Kruskal算法因为没讲并查集没怎么深入,最短路讲了Dijskra但没讲堆优化,学有余力的同学可以在这些方面上进行补充和拓展学习。

知识点总结

按知识点整理的一些比较重要需要掌握的东西

①数据结构基础:DFS搜全排列

②线性表:约瑟夫问题、多项式乘法

③栈与队:队列模拟题、中缀表达式求值

④树与二叉树:树的前中后序遍历与BFS遍历、从表达式建表达式树、二叉树插入与查找、赫夫曼树

⑤查找:二分查找

⑥图:最小生成树Prim和Kruskal、最短路Dijskra

⑦排序:冒泡选择插入、快排归并堆排

912f19fa537c07c0d49165826ca3bc84.png

工具推荐

《啊哈算法》和《算法导论》都有人推荐过了,我在这里推荐个宝藏UP主, 不分解的AgOH,我当时自学基于旋转的平衡树的时候被搞的焦头烂额,然后翻B站找到的这位up,里面的主席树,平衡树专题,前缀和差分快速幂,图的最短路和链式前向星(其实就是啊哈算法上的数组版邻接表的优化写法版)这些相对而言门槛低一些。

大作业

数据结构有个叫大作业的东西,说白了就是极限卡常,这一块建议根据个人情况投入精力。

大作业竞速相关:

1. 算法是重点。根据以往经验来看大作业是个串串题,性能比较好的算法一般是字典树和哈希表,其次是二叉树(平衡树)乃至数组二分,字典树和哈希表的性能优劣则与具体题目有关,一般字典树的常数大一些,2018级数据结构大作业的榜一做法为哈希表,但对于2019数据结构大作业,字典树充分利用了单词前缀,因此综合性能上超过了哈希表,榜一榜二的做法均为字典树。如果不确定哪一种做法更快则可以考虑都写一下,本地各跑1000次来看哪一个用时较短。

2. 算法不是唯一的重点。一方面以2019数据结构大作业字典树为例,同样是字典树,一篇文章用一棵树和两篇文章共用一棵树的性能不尽相同,而把从字典建树对文章查找改为从文章建树对字典查找可以把性能提升三倍,同样是哈希表,简单修改一下哈希函数和哈希数组大小也有可能给性能带来不小的提升,因此在考虑用什么算法的同时必须考虑细节上的怎么怎么用,另一方面大作业不出意外需要文件读写,极致追求效率的话fread和fwrite是不错的选择,将输入fread到buffer数组后还可以通过直接切分buffer数组来消除拷贝的耗时。

3. 其它性能优化技巧:开编译优化,尽量不写递归不分函数,必须递归的话参数尽量减少,拆掉小的循环,此外里面的东西性能相当糟糕,如有需要可以自己实现isupper/tolower等功能,多次malloc性能糟糕,可以一次性malloc来用,当然这些技巧可能会破坏程序的可读性与可维护性,非大作业这种极致追求性能的情况下不建议使用。

4. 本地测速的一些坑:测速的关键问题在于程序运行的时间是波动的,可以进行的措施包括累加和比较,累加即跑1000次计时,比较即不考虑绝对运行时间而考虑两个程序哪一个更快,把程序A跑一遍计时,把程序B跑一遍计时,重复1000次分别累加即可比较,特别注意先把程序A跑1000遍再把程序B跑1000遍的误差较大。此外OJ时间波动也比较厉害,可以多交几次看看自己程序的运行时间大致分布在怎样一个范围内,以便更合理的把握自己程序的性能。

向下滑动查看

学习技巧

一些坑点/提示

1. 初始化问题:全局变量默认初始化为0,局部变量需要注意初始化,否则值不可确定。

2. 的坑:以isdigit为例,这东西返回的是 0和非0,if (isdigit('5')==1)这种多半是会WA的。

3. strlen 在循环变量如for (int i=0;i

4. 告别微信刷屏, https://paste.ubuntu.com/是个好文明。

5. 出了bug先自己造一造数据看看能不能找出bug(6系计组必备技能),实在不行再去辛苦助教dalao们,虽然我不是助教(溜)。

e1ac9973235ba8d9ebf68415d31994c9.png

28730851c776e21654ee8fa7f9309742.png

董 翰 元

士谔书院2019级 计算机学院

数据结构与程序设计满分

总体感受

数据结构是一门比较重要的培养编程能力的基础课。在这门课上学到的内容无论是 具体的数据结构(栈队链表、树/图等)还是一些 更高阶的C语言知识(内存分配,指针,文件读写等)都为以后的学习和编程应用打下了重要的基础。

学习的过程还应以 理解和应用为主(理解每种数据结构的实现原理,最好是能形成一套自己的 代码模板;知道每种数据结构的应用范围),但是对于一些选填题中考察较多的概念也要适当背记。

另外,这门课另一个很重要的方面是 Debug 能力,在这门课的学习中可以关注一下 Debug 经验的积累。总体上来说本人的数据结构学习感受还是比较轻松的,除了综合性能大作业的优化以外,平时的作业不需要花特别多时间。和程设不太一样,一方面数据结构的作业和考试有选填题,并且占分不低,因此不要忽视 基础的概念和理论;另一方面是编程题的题目长度和代码长度相比于程设而言略微有所增加,思维难度远远低于程设,主要是注意细节。

总之希望学弟学妹们能够在数据结构课上学有所获,也学得开心!

知识点总结

①C语言基础进阶:结构体,指针、内存分配,文件读写,字符串。简单的时间复杂度分析和大O表示法

②线性数据结构:数组(一维、二维),链表(主要是单向链表),栈和队列

③树:有一些基本概念,二叉树(重要,二叉树的前序中序后序遍历,二叉查找树),以及表达式树,Huffman 树,字典树(课上讲的少,但大作业会用到),二叉堆(在后面堆排序中可能用到)

④查找:顺序表查找,二叉查找树,索引,B-树/B+树,散列(哈希表,大作业也可能用到)

⑤排序:冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序等。

⑥图论(期末不考,只在作业里有):有向图/无向图,图的邻接表和邻接矩阵表示,图的遍历,最小生成树(Prim, Kruskal),最短路(Dijkstra),AOE/AOV网(选填),拓扑序和关键路径(选填)。

⑦其他:前缀/中缀/后缀表达式和表达式树(这部分可以单独拿来当一个小专题)等。

工具推荐

数据结构可视化: visualgo,对于基础数据结构有很直观的演示,便于理解其原理。

c2447c34481a647f4fa60e724ba608f8.png

网课推荐:清华大学邓俊辉教授的《数据结构》(难度/深度/广度均大于北航的数据结构,并且用C++语言教学,适合基础很好且学有余力的同学)

教材推荐:机械工业出版社的《数据结构与算法分析(C语言描述)》

OJ刷题推荐:洛谷题单还有 leetcode

大作业

大作业是数据结构课程中一个花费的精力比较多也有一定挑战性的任务,通常来说是一道和单词词频统计有关的题目(2019级的题目是一个基于词频的文本相关性比较),成绩由正确性和性能分两部分组成,占总成绩的5分,其中2019级的规则中性能分为1.5分(即只要程序功能和结果正确即可得到3.5分)。大作业的开放时间大约从 3 月后期一直开放到期末结束,贯穿一整个学期,留给了大家充足的时间来完成。

数据结构大作业相比于普通作业最大的特色在于其性能分机制。性能的比较依据是程序的运行时间,将所有提交了的同学的程序运行时间从快到慢排序,排在最靠前一定比例的同学为满分,其余同学依次向下赋分。对于追求数据结构课总评 100 分的大佬同学来说,性能的优化是大作业的重点,也需要投入一定的精力。但同时也希望大家能理性看待性能分,不要为了刻意优化性能而浪费太多时间。

对于大作业而言最重要的一点是选择合适的数据结构。根据经验来看,对于单词的存储而言表现较好的数据结构为字典树或哈希表,其存储和查找效率较高并且易于编写程序。同时这道题还需要对词频进行排序,可以采用快速排序或桶排序等效率高的方式。选择合适的数据结构可以让你的程序性能站在一个比较高的起点。在选择了合适的数据结构的基础上,可以考虑采用 fread / fwrite 等效率更高的 IO 方式,将待读取的文章和字典分块读入甚至一次性完整读入内存,可以极大减少程序的运行时间。最后就是一些更加细节的优化,例如将函数展开到主函数当中来减少压栈出栈的开销,利用指针而非数组的方式来减少寻址的时间等。(需要声明的是,以上的大部分优化方法均并非本人首先想出,而是向学长和同学请教与讨论后的结果。所以也鼓励学弟学妹们多多和其他同学交流,会有很多收获)

向下滑动查看

总体感受

1. 别忽视选填。选择填空题占的分值还是比较高的,所以平时作业要认真做,有一些基础概念或者比较细节的知识点可以适当记住。

2. 不要太依赖评测结果。正常的线下考试是没有评测反馈结果的(2019级因为是线上考所以规则临时调整了),因此平时在做编程题时 争取一遍做对,慢一点也没关系(数据结构没有罚时)。读题的时候注意细节,写代码尽量一次写对并且要做好本地测试,不要太依赖评测结果,尤其不要“面向测试数据debug”。

3. 对于边界的判断要特别注意。例如:出栈时要判断栈非空;遍历链表时要判断指向当前节点的 指针非空,有时视具体情况可能还需要判断当前节点的下一个 节点非空;在有返回值的函数中如果有多种情况(有 `switch-case` 或者有比较多的 `if` 分支),要确保每一个分支都有返回值。另外这里补充一个小技巧:在写代码时可以适当利用"断言" ( `assert` ) 来约束一些容易出错的边界条件(如栈非空或指针非空,用 `assert(0)` 来标记一定不会执行到的 `else` 或 `default` 分支等)

4. Debug 很重要。(这一条,字少事大)

看完这份 AK宝典

士小信像打了鸡血一样

决定今天先从这门课学起

数据结构

对我们信息大类的学生至关重要

让我们一起不畏bug的阻拦

向 AK的目标进军吧!

文案丨郑好

排版丨李学峰

头图丨俞逸洋

责编丨陈莹 粉老师

快留言和 士小信分享

你 敲代码的感想吧!返回搜狐,查看更多

责任编辑:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值