OO 第三单元总结博客

OO-第三单元作业总结

作业内容介绍

OO第三次作业的任务是通过给定的JML规格,实现简单的社交关系模拟与查询程序.本次作业实际上只需要严格按照JML规格实现程序,就不会出现bug,大部分测试点都是在卡时间复杂度.

关于作业整体框架

这周的作业有点类似挖空填空.整体代码的框架已经给出,只需要根据课程组提供的接口实现一个类,在类中依据JML的要求实现一系列操作即可.三次作业互为迭代,每一次会增加一部分方法,并且修改一些原有的JML描述(这个比较坑,可能会注意不到已经实现的方法的JML要求变动)

UML类图

由于三次作业互为迭代开发,故使用最后一次作业的程序导出类图.

整体上的框架实际上已经在Interface和JML的定义中基本确定了,程序只是分别实现了这些Interface.特别的是,一部分通用的功能被抽取到了Helper类中执行实现.

性能问题

这一次作业的正确性,大体上是不太用担心的.只要严格按照JML要求来,就不会有问题.这次作业的核心问题在于算法的复杂度.由于人际关系网络实际上是一个图,在图上跑的算法,往往时间复杂度较高,很多操作运行比较慢,如果不把实现的性能优化的较好,很容易被卡出TLE.每一次作业基本都会涉及一些明显的需要优化性能的点

第一次作业

第一次作业中的qbs方法,需要实现为并查集算法.本人借助Java中内建的HashMap,较简单的实现了这个算法,并在加入relation的过程中,动态更新并查集,粗略估计时间复杂度为O(log(n)),其中n为已有人数

第二次作业

第二次作业中,根据JML要求,会有一个操作要求求最小生成树,实现这个方法时,同样使用了Java内建容器完成了Kruskal的实现,并加上了缓存.在最终测试时,qlc方法时间复杂度并没有出问题,但是qgvs却出现了性能问题,主要是实现时完全按照JML来,没有注意到其n2的时间复杂度,解决方法就是简单的去掉一重循环.

第三次作业

这一次作业的间接发送消息方法,要求求图的最短路.本人使用了最简单的Floyd算法,其时间复杂度为O(n3),但是运行一次就可以获得整个图任意两点之间的最短距离.对于一个确定的图(人数,关系确定),使用第一次请求图中某两点最短路的时间复杂度为O(n3),但是之后每一次查询 的时间复杂度都均为O(1),相当于一次运算之后,其他结果都是缓存过的.

最终在测试中,证明我之前的想法比较Naive,n3的复杂度速度实在太慢了.虽然本地跑没问题,但是评测机性能似乎不及本地,会出现TLE.

Network扩展

根据要求,需要新增几类Person接口的实现类,Advertiser,Producer,Customer.

Advertiser

根据Advertiser的描述,首先得让他有广告可以发送,所以他需要维护一个产品广告的集合.产品广告的集合在受到Producer要求和发送广告时进行更新.

Producer

根据Producer的要求,首先他得有能够售卖的产品,所以需要为他维护一个产品的集合.此集合只在Producer接受到Consumer的购买消息时更新,Producer也可以依据此集合向Advertiser发送信息.

Customer

Costomer大体上与Person没什么差别,只是可以接受Advertiser的请求,维护一个Information的集合,根据此集合的信息向相应Producer发送购买请求.

Network扩展方法

在Network中,首先需要支持对新增的三类人进行添加.之后,对于他们之间的信息传递,Network需要支持Advertiser到Customer的广播消息,Producer到Advertiser的请求消息,Customer到Producer的请求消息.当然,还要满足题目要求的查询销售额和销售路径的功能

添加Advertiser

	/*@ public normal_behavior
	  @ require (\forall int i; 0 <= i && i < advertisers.size(); !advertisers[i].equals(advertiser))
      @ assignable persons;
      @ assignable advertisers;
      @ ensures advertisers.size() == \old(advertisers.size()) + 1;
      @ ensures (\exists int i; 0 <= i && i < advertisers.size(); advertisers[i].equals(advertiser));
      @ ensures (\exists int i; 0 <= i && i < persons.size(); persons[i].equals(advertiser));
      @ ensures (\forall int i; 0 <= i && i < \old(advertisers.size());
      @             (\exists int j;0 <= j && j < advertisers.size();advertisers[j] == \old(advertisers[i])))
      @ ensures (\forall int i; 0 <= i && i < \old(persons.size());
      @             (\exists int j;0 <= j && j < persons.size();persons[j] == \old(persons[i])))
      @ also
      @ public exceptional_behavior
      @ signals (EqualPersonIdException) (\exists int i; 0 <= i && i < advertisers.size(); advertisers[i].equals(advertiser))
      @*/
void addAdvertise(Advertiser advertiser);

添加Producer

	/*@ public normal_behavior
	  @ require (\forall int i; 0 <= i && i < producers.size(); !producers[i].equals(advertiser))
      @ assignable persons;
      @ assignable producers;
      @ ensures producers.size() == \old(producers.size()) + 1;
      @ ensures (\exists int i; 0 <= i && i < producers.size(); producers[i].equals(producer));
      @ ensures (\exists int i; 0 <= i && i < persons.size(); persons[i].equals(producer));
      @ ensures (\forall int i; 0 <= i && i < \old(producers.size());
      @             (\exists int j;0 <= j && j < producers.size();producers[j].equal(\old(producer[i]))))
      @ ensures (\forall int i; 0 <= i && i < \old(persons.size());
      @             (\exists int j;0 <= j && j < persons.size();persons[j].equal(\old(persons[i]))))
      @ also
      @ public exceptional_behavior
      @ signals (EqualPersonIdException) (\exists int i; 0 <= i && i < producers.size(); producers[i].equals(producer))
      @*/
void addProducer(Producer producer);

查询销售额

   /*@ public normal_behavior 
   	 @ requires (\exist int i; 0 <= i && i < sales.size(); sales[i].getId() == objectId)
     @ ensures \result == sales[id];
     @ also
     @ public exceptional_behavior 
     @ signals (ObjectIdNotFoundException e) ((\forall int i; 0 <= i && i < sales.size(); sales[i].getId() != objectId)
    */
int /*@ pure @*/ getSales(int objectId)throws ObjectIdNotFoundException;
posted @ 2022-06-06 15:27  Dofingert  阅读(47)  评论(1编辑  收藏  举报