302
社区成员
发帖
与我相关
我的任务
分享一,架构设计
方法度量


类度量

类图

main:程序入口
inputnormalizer:预处理类,移除空白符和反复替换连续符号
lexer:词法分析,将输入的表达式分成一个个Token
parser:根据文法规则将表达式字符串解析为Poly对象,支持运算符优先级和条件表达式
functionregistry:集中管理非递归函数和递归函数的定义,并提供统一的函数调用扩展接口
recursivefunction:存储递归函数的基础情况和递推关系,使用缓存实现递归展开,避免重复计算
recurrence:封装递归函数中f{n}与f{n-1}、f{n-2}的关系参数
callkey:封装递归调用时的索引和参数
poly:实现代数运算、求导、替换
unit:乘法合并和有序比较
二、 架构设计体验:
第一次作业采用Lexer-Parser-Poly三层架构,Poly用Map表示多项式,结构清晰但功能受限。
第二次作业是关键重构,为支持exp和函数调用,引入Unit内部类将多项式表示重构为Map<Unit,BigInteger>,Unit封装了幂次和exp参数。
第三次作业采用增量扩展,Unit增加yPower字段支持二元变量,Parser增加求导和选择表达式解析,Poly实现求导方法,FunctionRegistry管理递归函数。
三,bug
第一次作业:无
第二次作业:有一处CPU_TIME_LIMIT_EXCEED和输出错误
第三次作业:有输出错误
互测的时候采用自己构造一些边界样例,在自己的代码先运行一次,成功的话再拿去互测。
四,优化
每次作业都会在上一次作业的基础上,把时间复杂度进行降维。以便保证计算的正确率。在replaceX和递归展开都使用缓存的办法,以避免计算重复。
五,新得体会
通过这三次作业学会面对扩展性的任务如何设计一个良好的架构,虽然在hw2,hw3的互测中被hack很多,但是相对于我来说有小小的进步。