hackerkiller

导航

统计

第一单元总结

第一单元总结

本单元作业表达式化简作业整体思维难度不高,但是需要实现的功能较为繁琐。由于本人并没有懒得参透递归下降的奥义,所以使用的方法相较于大众化的思路有很大差别。我所使用的方法是暴力扫描式子中的各种符号并递归展开,牺牲了一定的时间复杂度(最优O(nlogn)最差O(n^2)),但降低了维护和迭代的难度,使得第三次作业后总文件并未超过400行。

第一次作业

1、类图与解释

用上述方法以表达式、项、因子的层次调用divide逐步将表达式分解,直至分解为基本项。用这样的方法,对实现括号的嵌套这一功能的迭代十分友好。至于优化部分,我以多项式标准化格式Standard类对每一个表达式、项、因子做了实时简化。

2、类与方法度量
Method CogC ev(G) iv(G) v(G)
Element.divide(String) 10 3 8 9
Expression.divide(String) 13 2 11 12
MainClass.main(String[]) 0 1 1 1
Standard.Standard(HashMap<Integer, BigInteger>) 0 1 1 1
Standard.Standard(String) 2 1 3 3
Standard.addOrSub(Standard, char) 12 1 5 5
Standard.multiply(Standard) 7 1 4 4
Standard.toString() 23 3 13 16
Xiang.divide(String) 10 2 9 10
Class OCavg OCmax WMC
Element 6 6 6
Expression 6 6 6
MainClass 1 1 1
Standard 4.8 11 24
Xiang 6 6 6

由此可以看出,我此次代码的的编写,并未体现出面向对象的优越性,但重构太过麻烦,因此下面的迭代只能依托此继续进行。

3、bug分析

本次作业构造较为明了,并未发现bug。

第二次作业

1、类图与解释

此次作业的难点是加入了三角函数,我并未找到合适的处理方式,而仅将其作为字符串进行处理,以至于出现了将sin(x)**3展开成了sin(x)*sin(x)*sin(x)这样的负优化。对于三角函数的字符串,将其组合进Coefficient类中表示其与多项式的组合,仍然以Standard为标准类。
对于sum函数和自定义函数,则可以直接使用字符串代换的方式进行处理后再调用表达式的divide。

2、类与方法度量
Method CogC ev(G) iv(G) v(G)
Coefficient.Coefficient() 0 1 1 1
Coefficient.Coefficient(BigInteger) 0 1 1 1
Coefficient.Coefficient(HashMap<String, BigInteger>) 0 1 1 1
Coefficient.Coefficient(String) 0 1 1 1
Coefficient.addOrSub(Coefficient, char) 12 1 5 5
Coefficient.getHashMap() 0 1 1 1
Coefficient.multiply(Coefficient) 23 1 14 14
Element.divide(String, HashMap<Character, Function>) 19 5 17 19
Expression.divide(String, HashMap<Character, Function>) 13 2 11 12
Function.Function(String) 4 3 3 4
Function.getFunction(String[]) 3 1 4 4
MainClass.main(String[]) 1 1 2 2
Standard.Standard(HashMap<Integer, Coefficient>) 0 1 1 1
Standard.Standard(String) 5 1 4 4
Standard.addOrSub(Standard, char) 3 1 3 3
Standard.multiply(Standard) 7 1 4 4
Standard.toString() 66 4 22 27
Xiang.divide(String, HashMap<Character, Function>) 11 2 9 11
Class OCavg OCmax WMC
Coefficient 2.57 8 18
Element 12 12 12
Expression 6 6 6
Function 4 4 8
MainClass 2 2 2
Standard 6.2 19 31
Xiang 7 7 7

同上,此次代码的的编写,并未体现出面向对象的优越性。

3、bug分析

本次作业构造较为明了,并未发现bug。

第三次作业

1、类图与解释

此次需实现自定义函数及三角函数的嵌套,自定义函数以我的方法已经能够实现嵌套,而三角函数则需要改变纯字符串的写法。则需要将三角函数的内部以因子的方式处理完毕再转成字符串形式,然后进行合并。此次迭代的改动较少,因此第三次作业几乎没有消耗多少精力。

2、类与方法度量
Method CogC ev(G) iv(G) v(G)
Coefficient.Coefficient() 0 1 1 1
Coefficient.Coefficient(BigInteger) 0 1 1 1
Coefficient.Coefficient(HashMap<String, BigInteger>) 0 1 1 1
Coefficient.Coefficient(String) 0 1 1 1
Coefficient.addOrSub(Coefficient, char) 12 1 5 5
Coefficient.getHashMap() 0 1 1 1
Coefficient.multiply(Coefficient) 23 1 14 14
Element.divide(String, HashMap<Character, Function>) 27 5 21 24
Expression.divide(String, HashMap<Character, Function>) 13 2 11 12
Function.Function(String) 4 3 3 4
Function.getFunction(String[]) 3 1 4 4
MainClass.main(String[]) 1 1 2 2
Standard.Standard(HashMap<Integer, Coefficient>) 0 1 1 1
Standard.Standard(String, HashMap<Character, Function>) 26 1 12 16
Standard.addOrSub(Standard, char) 3 1 3 3
Standard.multiply(Standard) 7 1 4 4
Standard.toString() 66 4 22 27
Xiang.divide(String, HashMap<Character, Function>) 11 2 9 11
Class OCavg OCmax WMC
Coefficient 2.57 8 18
Element 16 16 16
Expression 6 6 6
Function 4 4 8
MainClass 2 2 2
Standard 7.6 19 38
Xiang 7 7 7

同上,此次代码的的编写,并未体现出面向对象的优越性。

3、bug分析

本次作业通过了强测,在互测时发现1个bug。即在迭代的时候没有考虑到sum()中的自变量可能超出int范围的情况。尽管从客观来讲这种情况并不合理,但还是没有逃过善于发现各种漏洞的hacker们。

hack策略

由于我对hack缺乏兴趣,也并不像别人对hack到的分散感兴趣,也不想去尝试理解别人冗长的代码,因此常年处于与世无争的状态,但在被hack的经验来看,hack数据大多属于在翻阅了指导书无数遍后找到的漏洞和极端数据。

总结

总的来说,我因为没有使用标准方法,而凑巧使用了一个代码量较小而复杂度较高的方法。尽管消耗了更少的精力解决了同样的问题,但并未体现面向对象的优越性,并未完全达到练习预期的效果。

posted on   hacker_killer  阅读(67)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示