PreSymble:用来预处理表达式里的空白符和多个符号同时出现的情况,主要是为了让符号直接纳入系数里,项与项之间便可直接认为是以加号相连。
GetPoly:用于从表达式里分割出项,并且将项分为若干个因子,存入列表中。主要是为了解析并存储整个表达式
Deriv:对每个因子进行求导,并且返回求导结果
Combine:用于多项式同类项合并
Least:作为因子的类,里面设计有输出函数(优化的地方)
Poly:作为项的类。
经过分析可以看到,combine和main的复杂度较高,因为我在main里一共进行了好几次独立操作,比如在项里遍历因子求导,但实际上这个操作应该放在poly里更为合适。combine里我先采用了treemap进行合并同类项,最后又把treemap遍历存入List当中,其实整个就可以直接只使用treemap。
因为我从第二次作业就开始重构了,第三次作业主要是基于第二次作业,加入了少部分格式判断,所以放在一起分析,以第三次作业为分析主体。
通过分析可以看到,之后的作业显然变得臃肿了起来。以sin为例,里面装了20行的正则匹配式子,而正则匹配的式子大可以放在一个类里面,封装为match类。同时decode方法里还包含了众多小操作:比如提取/判断sin系数,判断sin的指数等,这些都可以单独再封装进方法里。代码不够简洁,重复代码太多是这次臃肿的主要原因。
强测通过,互测被Hack一个点。因为最初将coe设置为bigdemical,所以在转换的时候用了一个int型的Temp来转换类型,最后导致数据溢出。这个错误对代码行等的复杂度没有影响。这个错误只要我稍微用过大数来测验就不会犯错,但由于摸鱼了所以没对自己进行测试,所以这个问题是完全可以用数据来检查的。
强测挂了部分点,互测被hack若干次(头被打爆)。虽然第二次重构了代码,但是仍然受到第一次的束缚,没有按照文档中的格式来书写正则,导致漏掉表达式因子也可能具有符号这一特点。所以在修复bug中,只能在表达式类提前判断是否具有符号。修复过程中代码改动量不大,但是明显可以感受到整个思路的错误走向,表达式符号只是冰山一角。
强测还是挂了一个点,互测被hack了一次。错误原因是来自于格式判断,误将一个正确表达式判断成了错误,没有考虑到首项出现x的情况。修复的时候只修改了check的一个标准即可,代码复杂度无变化。
第一次作业比较简单,主要错点就是大数处理和求导。所以只需要构造一次大数据检验大数处理是否合格,之后设定比较小的数据(最好是重复)来进行检验求导问题。
这两次作业我都没有主动hack别人(因为懒得搭建评测机,也不想看别人的代码),但是观察别人hack我的经验,主要是构造极端的数据,比如(-(-(-(-x))))这类数据。
三周以来每次作业基本都会花一天的时间构思,半天写代码,半天debug。尽管如此,我仍有很多地方考虑不够全面,比如提取系数、指数这类就应该封装进单独的方法里,而不是在解析方法里不断重复,导致代码臃肿不堪。所以在写代码的时候,也应该提前规划好要实现的功能,可以提前拟一张表格,这样会更清晰。
作业压力很大,很多东西都得自己预习来做,当时觉得很困难,甚至为此哭了一次,但是如今想来也没那么难。很多东西从初见到熟识都需要一个过程,学习也没有捷径可言,所以希望下次作业的我不要太畏畏缩缩,相信自己的能力,认真去实现。
原文:https://www.cnblogs.com/zhuxixi/p/14589994.html