OO暑期课程总结

一、作业总结

在补给站完成了Homework3 和Homework11。下面说明一下当时遇到的困难以及补的作业的针对性的改进。

Homework3

当时没通过的原因主要是没有面向对象的思想,总想把一堆功能混在一起,写着写着就陷进去了。可以说在设计层面上就已经失败了,再加上代码实现层面上时常出一些小的错误,就导致程序会出一些诡异的错误。还有一个原因就是对于正则表达式的运用不太熟悉,总想构造一个大正则去匹配整个表达式进行格式检查,但是由于学艺不精,未能成功,反倒浪费了很多时间。

改进策略参考了老师后来讲的设计思路。把项分为

Constant,// c

Poly, // c*x^n

Sin,// c*sin(x)^n

Cos,// c*cos(x)^n

linear,// f(x)+g(x)

recursive,// f(g(x))

chain ,//f(x)*g(x),

继承Item类 给自重写求导和输出方法

 接下来关键点就是把表达式的字符产构造位Item对象。经过替换一些字符,把表达式根据-+号拆分成项,再把项根据*号拆分成因子,最后对因子进行正则匹配识别他时什么类型的因子,返回一个继承自Item的对象,接下来就可以对他进行求导了。这样的改进可以做到,只要能生成Item类的对象,就可以对他进行求导,不管是递归还是相乘,都可以,因为每个类都已经重写了求导法则。这样整个程序的逻辑就变得十分清晰,更加面向对象,写起来就更加得心应手,也更不容易出错。

Homework11

当时没通过的原因主要是存储容器的选择和dijkstra算法掌握的不好。

重新完成的版本用并查集完成了iscirle函数,新建graph类完成了queryMinPath函数,新完成了 queryStrongLinked函数,用读入时维护数据查询时直接返回的思想改写了queryBlockSum函数。是否抛出异常的if-else判断和直接返回数据的简单函数基本沿袭之前版本。参考了优秀项目的设计思路:

对于 conflictSum 、 ageMean 和 ageVar ,直接在加入人的时候更新即可;对于 relationSum 和 valueSum ,还需要在改变 network 中人之间关系的同时进行修改。“

“强连通我使用了课程组给的方法,如果两个人不是直接连接,就采取每次删除一个人,遍历删除所有人的每一个,之后判断起点终点是否可达的方法。如果两个人因为删除一个人无法连通,就不是强连通。但是有一个问题,那就是两个人直接link的时候,这种做法是无效的。 所以这种情况需要特殊判断,就是遍历起点所有的相邻结点,如果起点的相邻结点(除去终点)有一条不经过起点可以到达终点的路径,那就是强连通的” 

“每次加入一个人,就blocksum加一,每次加入一个关系,如果加关系的两个人之前不是可达的,那就blocksum-1,代表两个块变成了一个块”

在代码实现方面:

  1. 并查集。通过网上了解并查集find和union的基本操作后自己完成了并查集的构造。
  2. 数据缓存。在MyGroup类的addPerson方法中调用update来实现系一列数据的更新。
  3. 新建graph类存储图的信息完成最短路径算法。因为担心dijkstra算法会超时,于是考虑使用了堆优化。其中用到的堆优化的dijkstra算法参考了下面这篇博客。https://www.cnblogs.com/czsharecode/p/10719170.html 
  4. 强连通。自己写了一个dfs算法去遍历。分两个人是不是直接连接两种情况分别完成。         
  5. 连通块。在数据缓存部分完成。

二、补给站收获和心得体会

  最大的收获是对面向对象有了更深的认识,一些小知识点也掌握的更好了,比如第一单元的正则表达式和第三单元的深搜和并查集。非常感谢老师能给我第二次机会去把正常上课时未能完全消化的知识好好消化,然后把自己没能顺利通过的作业通过。总的来说在补给站的学习收获颇丰。

三、给补给站建议

  希望老师和助教能在暑期课程中多给学生一些指导,比如有的时候会感觉题目无从下手,当然我们这届学生可以回看上课视频,回味老师当时对题目的讲解,如果是以后线下教学学生可就没有这样的资源了。对于代码能力弱一点的同学,可能还是不能很好的完成作业。总之还是再次很感谢老师和助教的付出,谢谢您!

原文地址:https://www.cnblogs.com/oofirst/p/13535244.html