面向对象第三单元博客
面向对象第三单元博客
第三单元为 JML规格的理解与实现,大部分方法都可以由JML规格理解后直接翻译成对应代码。
架构设计
对于isCircle
以及queryBlockSum
的设计
对于这两个方法的实现,我采用了并查集的方式解决,首先是在addPerson时初始化节点的父节点并将其设为根节点,父节点的对应关系用HashMap进行保存,根节点使用ArrayList进行保存,根节点是父节点为节点本身的节点的集合,所以每个根节点都对应这一个唯一的连通子图。在addRelation时对子图进行合并并更新父节点对应关系和根节点的集合。进行以上的设置之后isCircle
方法便只需要判断两个id的根节点是否相同,queryBlockSum
只需要返回根节点集合的个数。
对于queryLeastConnection
的设计
这个办法求的是id所在连通子图的最小生成树的边的权值和,我的做法是由于每个根节点对应一个连通子图,也对应一棵最小生成树,于是根据这个对应关系对每一个根节点都维护一棵最小生成树和权值,在查询时便直接返回最小生成树的权值即可,缺点是维护最小生成树的性能开销可能比较大。
心得体会
第三单元在基于JML规格基础下,实现了一个社交关系图的构造以及查询。Network
作为图的模型,People
为图的顶点,relation
为图的边。isCircle
是查询节点之间的连通性,BlockSum
是图的连通子图的个数,LeastConnection
是求id所在连通子图的最小生成树的边权值和,sendIndirectMessage
是求顶点间的最短路径值。理解了这些关键方法的含义能够更轻松地理解所对应的JML规格。