20172303 2018-2019-1《程序设计与数据结构》课程总结
- 课程:《程序设计与数据结构》
- 班级: 1723班
- 姓名: 范雯琪
- 学号:20172303
- 教师:王志强
- 助教:张师瑜/张之睿
- 必修/选修: 必修
每周作业链接汇总
- 第一周总结
- 简要内容:软件及数据结构的概述(软件质量的特征);算法分析(时间复杂度和空间复杂度);大O记法。
- 第二周总结
- 简要内容:ADT;使用数组实现栈;使用链表实现栈。
- 第三周总结
- 简要内容:队列相关概念;用链表实现队列;用数组实现队列;双端队列。
- 第四周总结
- 简要内容:列表相关概念(三种类型:有序列表、无序列表、索引列表);用数组实现列表;用链表实现列表;在数组中实现删除某一元素再将其后面的元素分别向前移动一位时应该选择正序还是逆序的判断方法。
- 第五周总结
- 简要内容:两种查找方法(线性查找和二分查找)及其比较;六种排序方法(选择排序、插入排序、冒泡排序、快速排序、归并排序和基数排序);查找方法和排序方法的时间复杂度分析;泛型方法的使用。
- 第六周总结
- 简要内容:树的相关术语、分类及四种遍历方法;二叉树的概念;二叉树的性质;用数组实现二叉树;用链表实现二叉树;二叉树的应用(表达式树和决策树);某些情况下一些方法要先定义一个私有方法再定义一个公有方法来调用它的原因。
- 第七周总结
- 简要内容:二叉查找树的概念;二叉查找树的实现;前驱结点和后继结点;平衡二叉查找树的方法;二叉查找树的应用(AVL树和红黑树);递归和迭代的区别。
- 第八周总结
- 简要内容:堆的概念;堆的相关操作(构造、插入、删除);用链表实现堆;用数组实现堆;堆排序。
- 第九周总结
- 简要内容:图的概念及分类;广度优先遍历(BFS)和深度优先遍历(DFS);寻找最小生成树;判断最短路径;图的实现策略(邻接列表和邻接矩阵);。
自认为写得最好一篇博客是?为什么?
- 个人觉得本学期写的最好的一篇博客是第5周学习总结。
- 在写总结博客的时候把这个学期写的所有教材内容学习博客都翻了一遍,发现其实我有一个很大的问题就是:教材内容总结写的多的时候基本问题就写的少,教材内容总结写的少的时候问题就写得相对多。唯一能找到的一篇两个都写的比较多的换句话说就是内容比较充实丰满的可能就是第五篇了。
- 而且我很清楚地记得当时写这篇博客的时候,为了把每一种查找/排序方法的代码分析和时间复杂度写出来,那部分的教材被我翻来覆去翻了好久,起码当时的我能保证那一部分的代码每一行是干嘛的我都清清楚楚(现在就不一定了 _(:з」∠) _ )。
- 除此之外我觉得这篇博客是我所有博客里最图文并茂的一篇博客了,当初那些动图花了好大功夫才找到,现在看起来还是蛮有成就感的ヾ(๑╹◡╹)ノ"
作业中阅读量最高的一篇博客是?谈谈经验?
- 阅读量最高的一篇博客也是第5周学习总结。经验的话说实话实在不好意思谈,因为本学期我的博客阅读量都不是很高,可能因为大家普遍博客都写的越来越好了。非要说的话可能就像我刚刚在上一部分分析的那样,首先是博客的内容比较充实,其次这一部分的内容都是一些很抽象的方法,概念看起来也不是很容易理解,但用图片这种比较直观的形式来表达就会让人比较容易理解原理。所以说,当相关教材内容比较抽象难以理解的时候,使用图文并茂的方式会更方便理解,也会让自己的博客看起来很美观,但是图文并茂的意思是图片和文字是同等重要的,如果你只放一大堆一大堆看起来很唬人的图,但是一点自己的理解都没有,那也不能叫图文并茂,这就是我的经验。
实验报告链接汇总
- 实验一 线性结构之数组和链表
- 简要内容:实现元素的插入、删除和输出;使用选择排序或冒泡排序对元素进行排序。
- 分别使用数组和链表实现以下三个节点:
- 节点一
- 通过键盘输入一些整数,建立一个链表。
- 打印所有链表元素, 并输出元素的总数。
- 在程序中,请用一个特殊变量名来纪录元素的总数。
- 节点二
- 从磁盘读取一个文件,这个文件有两个数字。
- 在实验一的基础上实现节点插入、删除、输出操作。
- 节点三
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(学号是单数,选择冒泡排序,否则选择选择排序)
- 在排序的每一个轮次中,打印元素的总数,和目前链表的所有元素。
- 实验二 树的应用
- 简要内容:二叉树、决策树、表达式树、二叉查找树、红黑树五种树的应用。
- 共设置了六个节点:
- (一)参考教材P212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder),用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试。
- (二)基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出先序ABDHIEJMNCFGKL和中序HDIBEMJNAFCKGL,构造出附图中的树,用JUnit或自己编写驱动类对自己实现的功能进行测试。
- (三)自己设计并实现一颗决策树。
- (四)输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分)。
- (五)完成PP11.3。
- (六)参考Java Collections API源码分析对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果。
- 实验三 查找与排序
- 简要内容:查找方法和排序方法的应用;新的查找方法:插值查找、斐波那契查找;新的排序方法:希尔排序、二叉树排序;Linux命令行复习;JUnit测试方法复习。
- 共设置了四个节点,一个选做节点:
- (一)定义一个Searching和Sorting类,并在类中实现LinearSearch(教材P162),SelectionSort方法(P169),最后完成测试。
- (二)重构你的代码,把
Sorting.java Searching.java
放入cn.edu.besti.cs1723.(姓名首字母+四位学号)包中。
- (三)参考七大查找算法在Searching中补充查找算法并测试,提交运行结果截图。
- (四)补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)。
- 选做:编写Android程序对各种查找与排序算法进行测试。
团队项目报告链接汇总
代码托管链接
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 上学期结束时的代码量:
- 本学期至今统计的代码量:
- 本学期的代码量为12870,本学期的代码量比上学期还多很多,很大的一个原因是本学期的各种实践活动比上个学期多了很多,感觉自己的动手实践能力也比上学期要提高不少,感谢王老师٩( 'ω' )و
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 重读这篇文章,感觉自己又有了不少新的体会。以前总觉得敲代码只要最终能实现就好,但就像一个软件要有可维护性一样,敲代码其实也是有很多技巧的。我一直觉得敲代码是一个很枯燥且烦躁的过程,因为想不出来的时候真的很难受,但我从来没有想过编程还可以用“优雅”来形容,就给人一种非常从容自信的感觉,人们总是嘲讽程序员是“程序猿”“码农”,可能在开始学习计算机之后我也有些不由自主地把自己代入这种角色中,但是就像老师上课说的一样,“码农”值得是不思考的机械的敲代码的程序员,如果能够将敲出优雅的代码作为目标,并经常思考怎样才能使代码变得更简单、更直观可读,那么敲代码其实就成为一种艺术了,耕耘艺术的人是绝对不会允许自己仅仅局限于“程序猿”“码农”的。
- 我找到一篇博客很好地总结了这篇文章的精髓:王垠《编程的智慧》总结,但是仅仅知道技巧是不够的,还是要多敲多练。然而就像《编程的智慧》刚开始说的那样,如果只是匆匆写出代码,却从来不回头去推敲,修改和提炼也是不行的,还是要把两者结合起来,才能真正提高自己的代码质量和编码水平,感觉有那么点辩证统一的意味在里面。
积极主动敲代码做到没?教材实践上有什么经验教训?
- 这个学期我感觉我可能比上学期更加积极了一点,就比如第一周总结的课后习题中有一个确定代码的增长函数和阶次的题,当时很自然地就想到应该实际敲一敲去实践一下,包括后来有一次敲书上代码的时候发现了代码有很多错误,如果不是自己敲而是直接复制粘贴别人的那就不可能发现这些错误了。所以说敲代码的时候一定要动脑子想,而不要只是机械地把代码从书本复制到IDEA上,这样对理解课本内容也非常有好处,就比如学广度优先遍历和深度优先遍历的时候,其实看教材的时候我完全不清楚它的原理,但是在仔细看了代码看懂之后就明白这两种遍历方法是怎么实现的了。
课堂项目实践
课堂实践链接
- 时间复杂度分析:计算时间复杂度,用大O记法进行表示,一共4道题。
- ArrayStack类的实现和测试:实现ArrayStack类中的peek、isEmpty、size和toString方法,并完成四个方法的测试。
- 链表插入:写出链表中节点插入的伪代码。
- 链表实践:通过键盘输入一些整数,建立一个链表;实现节点插入、删除、输出操作;使用冒泡排序法或者选择排序法根据数值大小对链表进行排序。
- 第4章代码检查:运行PP28,PP28的程序,根据个人学号输入后缀表达式并计算。
- LinkedStack补全:实现size、isEmpty和toString等方法并进行测试。
- 第5章代码检查:运行课本P72-P73凯撒密码程序。
- 杨辉三角(选做题):使用循环队列输出杨辉三角。
- 栈队列测试题:完成第六题的分析。
- 第6章代码检查:运行PP6.8和PP6.11的程序。
- 线性表实践:定义一个商品类Product,需要包括商品名称、价格等信息,使用链式存储结构实现一个线性表,存储商店中的商品,同时支持插入、删除、选择排序、查找等功能,并进行简单测试。
- ASL测试:已知线性表具有元素{5,13,19,21,37,56,64,75,80,88,92},如果使用折半查找法,计算其ASL。
- 三种查找算法练习:画出三种算法的存储形式和并计算ASL。
- 哈希冲突处理实践:把自己的学号加21,例如学号为1,把22添加到序列{11,78,10,1,3,2,4,21}后面,使用链地址法,解决冲突,同时计算ASL,输出冲突次数。
- 希尔排序测试:当D2等于2时,写出第2趟排序结果。
- 树-计算题:计算下列三道题
- 1.有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?
- 2.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?
- 3.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,…,nm个度为m的结点,问该树中有多少个叶结点?
- 树的深度和叶子个数计算:参考下面叶子节点计算的伪代码,计算课本中背部疼痛诊断器中决策树的叶子节点个数,并根据课堂介绍的递归树深度计算算法,计算决策树的深度。
int CountLeaf ( BiTree T, int &count )
{ if ( T )
{ if ( (!T->lchild) && (!T->rchild) )
count++; // 对叶子结点计数
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
}
}
- 中序和先序计算二叉树结构:已知一棵二叉树的先序序列和中序序列分别为ABDGHCEFI 和 GDHBAECIF,试确定二叉树结构。
- 层次遍历法实践:使用递归和非递归的方法实现层序遍历,遍历背部疼痛决策树,并按照层次顺序输出每个节点内容。
- 堆构造与排序:根据关键字序列:36,30,18,40,32,45,22,50,构造一颗小顶堆,并排序,画出构造堆过程(树+数组)
- 堆排序测试:根据关键字序列:36,30,18,40,32,45,22,50,利用数组构造一颗大顶堆,并排序。
- 十字链表练习:依照图画出十字链表结构。
- 最小生成树:依照图完成下列操作
- 1.画出Prim算法的最小生成树的生成过程
- 2.画出Kruscal算法的最小生成树的生成过程
- 3.计算最小权值
- Dijkstra(迪杰斯特拉)算法测试:使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。要求:(1)写出V1到各个顶点的最短路径(2)要求写出最短路径计算过程。
- AOE练习(加分):完成下图中四道题。
- 哈夫曼编码测试:设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树,并完成对英文文件的编码和解码。
课堂实践对提高应用能力有帮助吗?
- 感觉这学期老师讲的比上学期更好了,讲的都很清楚PPT内容也都很好,而且这个学期的实践数量相比上学期真的大幅度提升,我感觉对我的帮助挺大的,尤其是现在老师上课讲的很多内容都是给我们课外补充的,课堂实践经常能帮我巩固老师上课讲的内容,有些听课时没听懂或者比较模糊的地方在做题的时候就很容易搞明白。就像大一的时候学高数线代的时候一样,检测你知识学没学好的最佳方法就是看看你会不会做题(即实践)。
课堂实践上自己有什么经验教训?
- 上课认真听讲真的非常非常非常重要,上个学期有时候还因为感觉听不懂所以听不进去,所以经常用上课录视频或者下课问同学的方法来弥补,但是本学期真的是每一堂课都认认真真听下来了,课堂实践部分如果是用代码实现的实践还可能费点时间,但是那种纯靠思考手写的一般都会写,不过还是容易犯粗心的毛病。
课堂实践上对老师有什么教学建议?
- 首先希望老师如果之后还会教其他班的话一定要保持现在的讲课方式方法,真心觉得这学期比上学期讲得更好了而且每一节课都挺清楚的。课堂实践方面的话,希望老师不要总是对我们那么自信以为我们很轻易就能把实践做完,有些实践的结束时间稍微设的晚点吧(捂脸)。
课程收获与不足
自己的收获(投入,效率,效果等)
- 感觉这个学期学的真的比上学期好很多,首先博客质量要比上学期高,再者感觉对这个学期的学习脉络很清晰,就算有什么东西忘了,也能很快找到应该从哪儿再把它“捡”起来,我觉得这就是进步,不像上个学期那样学的稀里糊涂的,这学期有时候有些东西要用到上学期的知识时要来回翻半天。
- 然后就是关于java的学习模式,以前就是很随意,有时候先看书后写博客,有时候边看边写,但是本学期就形成了一套固定的而且相对而言比较成熟的学习模式,就是先把教材内容看完,然后敲代码做课后题,最后再写博客。因为在敲代码的过程中经常会对课本内容有一些更深刻的理解,这样在写教材内容总结的时候也能够更充实。
自己需要改进的地方
- 效率问题吧,感觉这学期虽然对内容学得比较清楚,但是效率真的不高,尤其是写博客的效率,经常在一个小地方卡半天。
- 然后还有一点,可能因为这个学期学习的时间有所减少,所以对于教材上的内容深究的不多了,很多东西都只是浮于表面,我觉得这也是我这学期博客中提出的问题很少的原因所在,在今后的学习中一定要努力避免这种情况。
结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- 说起来惭愧,感觉我和结对伙伴这学期的状态和上学期正好是相反的,刚开学的几周状态很好,巅峰应该是第四周,国庆的时候我们两个从4号开始泡到912学java,最搞笑的是自己的问题都是对方帮忙解决的。但是往后由于种种原因,结对学习的时间逐渐变少,可能到了期末做项目的时候又好起来了。
- 虽然我也帮他解决了不少代码上的问题,但我觉得我本学期和他说的最多的还是怎么把博客写的更好一点。本学期我的结对伙伴给我提供的帮助包括各种方面,课本上代码的理解啊,IDEA里的运行错误啊,包括如何修改博客园的字体样式也是他教会我的,总体而言还是给我提供了很多帮助的~
问卷调查
你平均每周投入到本课程有效学习时间有多少?
- 20-30小时,感觉比上个学期要多,一般可能要一到两天的时间。
每周的学习效率有提高吗?你是怎么衡量的?
- 感觉有了前期的积累,后期学起来要效率高一点。
- 首先是有了(自认为的)规范的学习模式,再其次是这学期后期的学习内容基本都和树是相关的,学习起来比较连贯,课后实践也基本前后有联系,相对而言效率要比前期高。
蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 有啊!而且这学期蓝墨云改版了,PPT看起来更方便了,而且这学期基本都是一些文档博客PPT,相比上学期的视频而言看起来更方便了。
- 建议是希望班课上的资源还是文档类的比较好,视频类的真的不方便看,如果设置成进度条不可拖拽的话有些时候比较浪费时间。
你觉得这门课老师应该继续做哪一件事情?
- 不只局限于课本。如果真的课本内容比较简单就讲一些课外的知识,感觉这学期真的学习到了好多知识。
你觉得这门课老师应该停止做哪一件事情?
- 那种拍视频一个0.5分的加分项,有时候课上回答一个问题也能加0.5分,但是拍视频真的是个蛮费时间的事情,最后只给加0.5分感觉有点亏,而且上传之后看的人不是很多(基本都十来个人左右),如果不能稍微增加分值的话感觉这个还是取消比较好。
你觉得这门课老师应该开始做什么新的事情?
- 暂时还没有想到...感觉现在java这种翻转课堂的授课模式已经成熟得不能再成熟了。
- 那就希望老铁能偶尔稍微休息休息吧不要再那么累自己了_(:з」∠)_
其他自由发挥
- 写到这里其实可以说整个程序设计与数据结构课程的学习也就接近尾声了,想想这是最后一篇博客了还有些兴奋。
- 说实话博客是我整个学习过程中最磨人的小妖精了,经常因为写博客花费很多时间,一直再纠结应该怎么写,因为我有一些功利心理,所以总想着怎么才能把博客写好拿到加分,经常写得愁眉苦脸整天郁郁不得志,有时候周围人比自己博客写的晚但交得早那种感觉真的蛮苦涩的,如果有一篇博客自己觉得写得贼好结果最后没拿到加分,可能后面几周写博客的时候都会很纠结,害怕自己又写不好,还会经常去看那回加分的那几篇博客有哪些优点可以借鉴。这种功利的追求加分真的把自己搞得蛮累的,不过起码写出来的博客都还让自己比较满意,内容还算充实。希望之后还有学习这门课的学弟学妹在偶然间翻到我的博客时不会觉得“这个人博客写的好水啊”,如果他们能够觉得我哪一篇博客写得不错那我就更开心啦。
- 我一直很清楚我不是那种java学的好的人,到现在为止还有些东西可能概念还是不清晰(主要集中在上学期学习的东西),记得本学期一次上课的时候老师重新提起递归,当时有些同学立马就能说出递归是什么,一针见血说出它的要点,但当时我却脑子一片空白,我就很慌张,赶紧翻以前的博客去看。人都是有忘性的,所以说知识是要及时复习的,因为java学习和其他课程的学习形式有所不同,让我经常忽略这点,在以后其他课程的学习中一定要注意及时复习。
- 也不知道自己絮絮叨叨打了这么多会不会都是废话,总而言之,整个java的学习过程还是痛并快乐着的,那种Debug了好多次改了好久的代码最后终于运行成功的想让人到操场飞奔十几圈的开心可能是我在其他事情上永远感受不到的。
给出你的总结中涉及到的链接的二维码
教材内容总结
- 第一周总结
- 第二周总结
- 第三周总结
- 第四周总结
- 第五周总结
- 第六周总结
- 第七周总结
- 第八周总结
- 第九周总结
实验报告
- 实验一 线性结构之数组和链表
- 实验二 树的应用
- 实验三 查找与排序
项目
- 团队作业第一周
- 团队作业第二周
- 冲刺阶段Day1-Day7
课堂实践
- 时间复杂度分析
- ArrayStack类的实现和测试
- 链表插入
- 链表实践
- 第4章代码检查
- LinkedStack补全
- 第5章代码检查
- 杨辉三角(选做题)
- 栈队列测试题
- 第6章代码检查
- 线性表实践
- ASL测试
- 三种查找算法练习
- 哈希冲突处理实践
- 希尔排序测试
- 树-计算题
- 树的深度和叶子个数计算
- 中序和先序计算二叉树结构
- 层次遍历法实践
- 堆构造与排序
- 堆排序测试
- 十字链表练习
- 最小生成树
- Dijkstra(迪杰斯特拉)算法测试
- AOE练习(加分)
- 哈夫曼编码测试