OO第二次博客作业
BUAA_1706_HugeGun
目录
关于电梯&多线程 |
电梯:
这个单元的作业,我基本上是以完成生活中最常见的电梯为目标,这样电梯效率其实很不错。
但是,关于更多的优化,其实我觉得影响并不是太大,因为在实际测试过程中,我发现,经常出现本来跑得快的电梯会因为接不上慢电梯能接上的人而导致此电梯在这组数据上甚至比很多其他电梯都慢。关于其他细节会在测试章节描述。
多线程:
第五次作业,我的电梯线程用的暴力轮询,很好写。
第六次作业,我发现暴力轮询会(T)掉(CPU) (time)。但是为了方便写代码以及防止死锁,我并没有使用(wait)和(notify)于是在循环里加了(sleep)使(CPU)时间降低到最多(1)秒。
三次作业遇到的BUG |
由于公测没有wa过,所以列举一下写作业过程中的bug和互测的bug
第五次作业:
1、转向策略判断条件写错
2、电梯运行速度写错
第六次作业:
无
第七次作业:
1、调用方法过于复杂,导致死锁(概率大约1/500)‘
2、换乘不全面导致跑不出来
2、替换缩进tab为空格把合法字符集的tab替了
3、多层嵌套出问题
总结:
本单元作业不难,本地测试充分之后很难出错,多线程编程要小心死锁。
1、对题面理解的疏忽
2、对自己代码架构细节出现问题(使用错误方法
3、不小心写错
在经历三次互测之后,我发现, 别人关于1,2产生的bug较多,我关于2,3产生的bug较多。
当然,关于别人的bug是在强测之后,自己代码的在进入互测时只存在第3种bug,第2种bug在编写时有时出现,这意味着我还需要写作业时更细心,尤其是第三次作业的第二个bug让我非常地伤心555。
代码分析 |
第五次作业:
类图:
复杂度:
ev(G) | iv(G) | v(G) | |
---|---|---|---|
main.Building.add(Person) | 1.0 | 1.0 | 1.0 |
main.Building.Building() | 1.0 | 2.0 | 2.0 |
main.Building.getfloor(int) | 1.0 | 1.0 | 1.0 |
main.Elevator.close() | 1.0 | 1.0 | 1.0 |
main.Elevator.Elevator() | 1.0 | 1.0 | 1.0 |
main.Elevator.Elevator(Input) | 1.0 | 1.0 | 1.0 |
main.Elevator.find() | 3.0 | 2.0 | 4.0 |
main.Elevator.getdir() | 1.0 | 1.0 | 1.0 |
main.Elevator.getnow() | 1.0 | 1.0 | 1.0 |
main.Elevator.getperson() | 1.0 | 1.0 | 1.0 |
main.Elevator.go() | 3.0 | 7.0 | 9.0 |
main.Elevator.move(int) | 12.0 | 9.0 | 16.0 |
main.Elevator.open() | 1.0 | 1.0 | 1.0 |
main.Elevator.pull() | 1.0 | 4.0 | 5.0 |
main.Elevator.push() | 1.0 | 1.0 | 1.0 |
main.Floor.add(Person) | 1.0 | 1.0 | 1.0 |
main.Floor.Floor() | 1.0 | 1.0 | 1.0 |
main.Floor.getsize() | 1.0 | 1.0 | 1.0 |
main.Floor.push(Elevator) | 3.0 | 3.0 | 4.0 |
main.Input.getbuilding() | 1.0 | 1.0 | 1.0 |
main.Input.getflag() | 1.0 | 1.0 | 1.0 |
main.Input.Input() | 1.0 | 1.0 | 1.0 |
main.Input.run() | 1.0 | 2.0 | 2.0 |
main.Input.st() | 3.0 | 3.0 | 3.0 |
main.Input.start() | 1.0 | 2.0 | 2.0 |
main.Main.main(String[]) | 3.0 | 2.0 | 3.0 |
main.Person.find() | 3.0 | 4.0 | 4.0 |
main.Person.getdir() | 1.0 | 1.0 | 1.0 |
main.Person.getid() | 1.0 | 1.0 | 1.0 |
main.Person.getnow() | 1.0 | 1.0 | 1.0 |
main.Person.gettarget() | 1.0 | 1.0 | 1.0 |
main.Person.Person() | 1.0 | 1.0 | 1.0 |
main.Person.Person(String) | 1.0 | 1.0 | 2.0 |
Total | 56.0 | 62.0 | 77.0 |
Average | 1.696969696969697 | 1.878787878787879 | 2.3333333333333335 |
耦合度:
class | OCavg | WMC |
---|---|---|
main.Building | 1.3333333333333333 | 4.0 |
main.Elevator | 2.9166666666666665 | 35.0 |
main.Floor | 1.75 | 7.0 |
main.Input | 1.5 | 9.0 |
main.Main | 3.0 | 3.0 |
main.Person | 1.4285714285714286 | 10.0 |
Total | 68.0 | |
Average | 2.0606060606060606 | 11.333333333333334 |
第一次作业我用的look算法模拟的真实电梯。
第六次作业:
类图:
复杂度:
method | ev(G) | iv(G) | v(G) |
---|---|---|---|
main.Building.add(Person) | 1.0 | 1.0 | 1.0 |
main.Building.Building() | 1.0 | 2.0 | 2.0 |
main.Building.getfloor(int) | 1.0 | 1.0 | 1.0 |
main.Elevator.arrive() | 1.0 | 1.0 | 1.0 |
main.Elevator.close() | 1.0 | 1.0 | 1.0 |
main.Elevator.Elevator() | 1.0 | 1.0 | 1.0 |
main.Elevator.Elevator(Input) | 1.0 | 1.0 | 1.0 |
main.Elevator.find() | 3.0 | 8.0 | 10.0 |
main.Elevator.getdir() | 1.0 | 1.0 | 1.0 |
main.Elevator.getnow() | 1.0 | 1.0 | 1.0 |
main.Elevator.getperson() | 1.0 | 1.0 | 1.0 |
main.Elevator.go() | 3.0 | 10.0 | 13.0 |
main.Elevator.id(int) | 2.0 | 1.0 | 2.0 |
main.Elevator.jseq() | 8.0 | 5.0 | 8.0 |
main.Elevator.max(long,long) | 2.0 | 1.0 | 2.0 |
main.Elevator.move(int) | 12.0 | 9.0 | 16.0 |
main.Elevator.open() | 1.0 | 1.0 | 1.0 |
main.Elevator.pull() | 1.0 | 4.0 | 5.0 |
main.Elevator.push() | 1.0 | 1.0 | 1.0 |
main.Elevator.setdir(int) | 1.0 | 1.0 | 1.0 |
main.Floor.add(Person) | 1.0 | 1.0 | 1.0 |
main.Floor.Floor() | 1.0 | 1.0 | 1.0 |
main.Floor.getdir(int) | 3.0 | 2.0 | 3.0 |
main.Floor.getnoem() | 2.0 | 1.0 | 2.0 |
main.Floor.getsize() | 1.0 | 1.0 | 1.0 |
main.Floor.push(Elevator) | 3.0 | 3.0 | 4.0 |
main.Input.getbuilding() | 1.0 | 1.0 | 1.0 |
main.Input.getflag() | 1.0 | 1.0 | 1.0 |
main.Input.Input() | 1.0 | 1.0 | 1.0 |
main.Input.run() | 1.0 | 2.0 | 2.0 |
main.Input.st() | 3.0 | 3.0 | 3.0 |
main.Input.start() | 1.0 | 2.0 | 2.0 |
main.Main.main(String[]) | 3.0 | 4.0 | 5.0 |
main.Person.find() | 3.0 | 4.0 | 4.0 |
main.Person.getdir() | 1.0 | 1.0 | 1.0 |
main.Person.getid() | 1.0 | 1.0 | 1.0 |
main.Person.getnow() | 1.0 | 1.0 | 1.0 |
main.Person.gettarget() | 1.0 | 1.0 | 1.0 |
main.Person.id(int) | 2.0 | 1.0 | 2.0 |
main.Person.Person() | 1.0 | 1.0 | 1.0 |
main.Person.Person(String) | 1.0 | 1.0 | 2.0 |
Total | 77.0 | 86.0 | 110.0 |
Average | 1.8780487804878048 | 2.097560975609756 | 2.682926829268293 |
耦合度:
class | OCavg | WMC |
---|---|---|
main.Building | 1.3333333333333333 | 4.0 |
main.Elevator | 3.235294117647059 | 55.0 |
main.Floor | 2.0 | 12.0 |
main.Input | 1.5 | 9.0 |
main.Main | 3.0 | 3.0 |
main.Person | 1.5 | 12.0 |
Total | 95.0 | |
Average | 2.317073170731707 | 15.833333333333334 |
第六次作业和第五次一样,改一下楼层和输出就行了。
使用四元组来表示一个项,分别为一个项的系数,x的指数,sin的指数,cos的指数。若干项装进map形成function。
这次作业优化写了很久也拿到了满分,详情会在优化博客描述。
第七次作业:
类图:
复杂度:
method | ev(G) | iv(G) | v(G) |
---|---|---|---|
main.All.add(Person) | 1.0 | 1.0 | 1.0 |
main.All.addall(Person) | 1.0 | 1.0 | 1.0 |
main.All.addper(Person) | 1.0 | 1.0 | 7.0 |
main.All.addsum(int) | 1.0 | 1.0 | 1.0 |
main.All.All(ArrayList,ArrayList,ArrayList) | 1.0 | 1.0 | 1.0 |
main.All.can(ArrayList,int,int) | 2.0 | 2.0 | 3.0 |
main.All.geta() | 1.0 | 1.0 | 1.0 |
main.All.getb() | 1.0 | 1.0 | 1.0 |
main.All.getc() | 1.0 | 1.0 | 1.0 |
main.All.getfla() | 1.0 | 1.0 | 1.0 |
main.All.getflb() | 1.0 | 1.0 | 1.0 |
main.All.getflc() | 1.0 | 1.0 | 1.0 |
main.All.getsum() | 1.0 | 1.0 | 1.0 |
main.All.init(Input) | 1.0 | 1.0 | 1.0 |
main.All.stop() | 2.0 | 2.0 | 3.0 |
main.Building.add(Person) | 1.0 | 1.0 | 1.0 |
main.Building.addall(Person) | 1.0 | 1.0 | 1.0 |
main.Building.Building() | 1.0 | 1.0 | 1.0 |
main.Building.Building(All) | 1.0 | 2.0 | 2.0 |
main.Building.getfloor(int) | 1.0 | 1.0 | 1.0 |
main.Building.getsum() | 1.0 | 1.0 | 1.0 |
main.Building.stop() | 1.0 | 1.0 | 1.0 |
main.Building.subsum(int) | 1.0 | 1.0 | 1.0 |
main.Elevator.arrive() | 1.0 | 1.0 | 1.0 |
main.Elevator.close() | 1.0 | 1.0 | 1.0 |
main.Elevator.Elevator(Building,long,int,String,Object) | 1.0 | 1.0 | 1.0 |
main.Elevator.find() | 3.0 | 8.0 | 10.0 |
main.Elevator.getcap() | 1.0 | 1.0 | 1.0 |
main.Elevator.getdir() | 1.0 | 1.0 | 1.0 |
main.Elevator.getname() | 1.0 | 1.0 | 1.0 |
main.Elevator.getnow() | 1.0 | 1.0 | 1.0 |
main.Elevator.getperson() | 1.0 | 1.0 | 1.0 |
main.Elevator.getsum() | 1.0 | 1.0 | 1.0 |
main.Elevator.go() | 3.0 | 10.0 | 15.0 |
main.Elevator.id(int) | 2.0 | 1.0 | 2.0 |
main.Elevator.jseq() | 8.0 | 5.0 | 8.0 |
main.Elevator.max(long,long) | 2.0 | 1.0 | 2.0 |
main.Elevator.move() | 11.0 | 8.0 | 16.0 |
main.Elevator.open() | 1.0 | 1.0 | 1.0 |
main.Elevator.pull() | 1.0 | 5.0 | 6.0 |
main.Elevator.push() | 1.0 | 1.0 | 1.0 |
main.Elevator.run() | 1.0 | 2.0 | 2.0 |
main.Elevator.setdir(int) | 1.0 | 1.0 | 1.0 |
main.Elevator.st() | 3.0 | 3.0 | 4.0 |
main.Elevator.start() | 1.0 | 2.0 | 2.0 |
main.Elevator.subcap() | 1.0 | 1.0 | 1.0 |
main.Floor.add(Person) | 1.0 | 1.0 | 1.0 |
main.Floor.Floor() | 1.0 | 1.0 | 1.0 |
main.Floor.Floor(Building) | 1.0 | 1.0 | 1.0 |
main.Floor.getdir(int) | 3.0 | 2.0 | 3.0 |
main.Floor.getnoem() | 2.0 | 1.0 | 2.0 |
main.Floor.getsize() | 1.0 | 1.0 | 1.0 |
main.Floor.push(Elevator,Object) | 5.0 | 4.0 | 6.0 |
main.Floor.subsum(int) | 1.0 | 1.0 | 1.0 |
main.Input.geta() | 1.0 | 1.0 | 1.0 |
main.Input.getb() | 1.0 | 1.0 | 1.0 |
main.Input.getbuilding() | 1.0 | 1.0 | 1.0 |
main.Input.getc() | 1.0 | 1.0 | 1.0 |
main.Input.getflag() | 1.0 | 1.0 | 1.0 |
main.Input.Input(All) | 1.0 | 1.0 | 1.0 |
main.Input.run() | 1.0 | 2.0 | 2.0 |
main.Input.st() | 3.0 | 3.0 | 3.0 |
main.Input.start() | 1.0 | 2.0 | 2.0 |
main.Main.main(String[]) | 1.0 | 6.0 | 6.0 |
main.Person.find() | 3.0 | 4.0 | 4.0 |
main.Person.getdir() | 1.0 | 1.0 | 1.0 |
main.Person.getid() | 1.0 | 1.0 | 1.0 |
main.Person.getneed() | 1.0 | 1.0 | 1.0 |
main.Person.getnow() | 1.0 | 1.0 | 1.0 |
main.Person.gettarget() | 1.0 | 1.0 | 1.0 |
main.Person.id(int) | 2.0 | 1.0 | 2.0 |
main.Person.init(String,ArrayList,ArrayList,ArrayList) | 1.0 | 3.0 | 11.0 |
main.Person.maintain() | 1.0 | 1.0 | 2.0 |
main.Person.Person() | 1.0 | 1.0 | 1.0 |
main.Person.reverse() | 1.0 | 1.0 | 1.0 |
Total | 114.0 | 131.0 | 175.0 |
Average | 1.52 | 1.7466666666666666 | 2.3333333333333335 |
耦合度:
class | OCavg | WMC |
---|---|---|
main.All | 1.5333333333333334 | 23.0 |
main.Building | 1.125 | 9.0 |
main.Elevator | 2.869565217391304 | 66.0 |
main.Floor | 2.0 | 16.0 |
main.Input | 1.3333333333333333 | 12.0 |
main.Main | 6.0 | 6.0 |
main.Person | 1.9090909090909092 | 21.0 |
Total | 153.0 | |
Average | 2.04 | 21.857142857142858 |
第三次搞了个分配器,将任务分配给三个电梯。
对于需要换乘的情况,我模拟了现实生活中的策略,即由人来选择在哪里换乘,我是人,所以我来决定。也就是说,在请求到达的时候,根据我预先分配的策略进行拆分请求。
测试感想 |
对于电梯来讲,我觉得,没有一种策略能够在所有情况下都达到最快。
根据课下几百上千组的测试,我们十几个人中有四个人的效率其实差不多。
而在第六次作业中,我发现我故意延迟100ms的启动时间,最终的平均运行时间甚至会减少。可惜第六次作业的强测数据太过鬼畜,导致成绩8太好。
时序图:
ps:用的高中建的blog,里面有很多算法题题解和模板,有兴趣的可以玩一玩。