BUAA-OO-Unit1-总结

张雯幻-22230609 学生 2024-03-20 15:43:03

BUAA-OO-Unit1-总结

目录

  • BUAA-OO-Unit1-总结
  • HW1
  • UML类图
  • 架构分析
  • 方法复杂度
  • 类复杂度
  • Bug分析
  • 性能优化
  • HW2
  • UML类图
  • 架构分析
  • 方法复杂度
  • 类复杂度
  • Bug分析
  • 性能优化
  • HW3
  • UML类图
  • 架构分析
  • 方法复杂度
  • 类复杂度
  • Bug分析
  • 性能分析
  • 心得体会

HW1

UML类图

img

架构分析

  • 采用递归下降策略进行解析。
    Factor设置成接口,使VariableNumberExpr继承该接口。
    Parse对字符串进行解析,得到一个Expr
  • 使用多项式类进行计算。
    将得到的Expr进行递归下降式的计算,在TermFactor都加入compute方法,进行递归计算。
    计算后得到一个关于x的多项式。
  • 重写toString方法得到结果。

方法复杂度

img

类复杂度

img

Bug分析

第一次作业较为简单,在评测和互测中没有遇到Bug。

性能优化

在得到存有最后结果的多项式后,调用toString将其转换为字符串。为了使字符串尽可能的短,在保证不会出现1*x或者?+0的前提下,应该尽可能的将正项放在式子的收尾,可以减少一个+。使式子变短。因此我在toString时先对多项式遍历一边,将遇到的第一个正项输出,然后再遍历一遍输出其他项,以达到目的。

HW2

UML类图

img

架构分析

  • 第二次作业在第一次作业的基础上添加了FunctionIndex因子类,同样使它们继承Factor接口。
  • 同时因为单项式的变现形式更加复杂,所以引入单项式类Monomial,每个单项式的变现形式为x^n*exp(多项式)。而多项式则由一系列单项式组成。在Poly类中使用TreeMap<Monomila,BigInteger>存储单项式,其中BigINteger是每个单项式的系数。
  • 为了确保相同的单项式可以相互加减合并,我再Monomial类中重写了equalshashCode方法,以便可以在TreeMap中直接读取出可以合并的单项式。
  • 这里使用TreeMap的一个重要原因是为了使存在容器中的单项式是有序的。因为我判断两个多项式是否相同的方法是比较两个多项式toString后的字符串是否完全相同,因此要保证两个相同的多项式的容器中存储的单项式的顺序也是完全相同的。因此我加入了一个MonoComparator类,继承了Comparator<Monomial>接口并重写了compare方法,并在定义TreeMap时令this.polynomial = new TreeMap<>(new MonoComparator());这样就保证了TreeMap可以按照我制定的比较法则对容器里的内容进行排序,这样就保证了多项式的统一。

方法复杂度

img

img

类复杂度

img

Bug分析

这次作业中我在强测中错了两个点。

  1. 其中一个是:
0
(((((((((((x^8)^8)^8)^8)^8)^8)^8)^8)^8)^8)^8)^8

这个点会错是因为我将指数的类型定义位int导致无法存储过大的指数。在将其改为BigInteger后解决了问题。

  1. 另一个是:
2
h(x,y)=(-2*(+exp (y)-(        -y*x^004++05*y*y^+002)^03*x)^+5*(-2        *exp(     013)* exp(y^ +3)- +x  *(++x *-16*y^005)^+01)+exp((+007+-y^0    *004)  ^+1)^5*(+  -(-y    )*x--y        ^03 ))
g(z  ,x)=     --((- 017*(+x^    +001*+007--  z*z^ +0*z)^+000*(0019*z)^00+x^+5  *z^        +0     * exp(z^+005)))^1- exp(    exp     ((    + +-09*     x+x^+3)))^002
     (++(( +x*x)*(    0017)^     00*exp(01)^    +04-h(x, x)     *(-x*00*x)    * (+-x) )*exp((++  x        ^2--+000     ))^+002*(+     008     )^    00    -+x^005*-8 )

这个数据我的结果正确,但运行时间过长导致TLE。在我调试我的代码后发现我的toString方法消耗了大量的时间,因为我是用字符串比较两个exp中的多项式是否相等。因此我对这个方法进行了改进,在性能优化中写出。

性能优化

这次作业我进行了两种优化。

  1. 第一个是时间上,在强侧后,我知道了我的toString方法消耗了大量的运行时间,所以我在Poly类和Monomial类中都增加了一个String属性,专门用来存对象的字符串表示,并且只在单项式或多项式的内容发生变化时才将其更新。因此在进行比较时直接使用get方法即可得到对应多项式的字符串形式,不必在每次比较时调用toString节省了大量的时间。也使我通过了强测中运行时间过长的数据点。
  2. 第二个是结果长度上,这里我使用了第二次作业讨论区某大佬总结的方法:

img

依次对提取后的式子进行长度比较,最后得到最短的那条。基本上可以做到强侧性能分满分(除去几个别特殊情况的提取外,也能得到99点几分)

HW3

UML类图

第三次多页于第二次作业没有结构上的变化,只是增加了一个求导因子类,所以类图大体相同。

架构分析

第三次作业较为简单,只要在多项式类中增加求导方法,并增加一个因子即可。

方法复杂度

img

类复杂度

img

Bug分析

第三次作业较为简单,没有遇见Bug,并且没有hack成功。

性能分析

第三次作业结果的形式与第二次作业相同,所以优化上也相同。

心得体会

通过第一单元的学习,我初步体会到了面向对象程序设计的思想,体会到了迭代开发的设计思路。与我在oo先导课时将大量方法写在Main类中的设计有了很大的提升。

...全文
90 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧