安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

数据结构与算法

4月20日 封了心投稿
  摘要
  本期通过实现图的接口函数,来进一步理解在代码中,图的结构是如何形成的,比如怎么定义边、如何定义顶点、如何定义边与顶点的连接关系等等。
  上期介绍了图的实现方案,以及图的接口,顶点的结构类,边的结构类等。本期继续实现图的接口。准备
  首先创建一个图的类,定义顶点和边的类放在图的类中,还要定义存储顶点和边的属性。这里使用HashMap存储顶点,可以快速找到某一个顶点,使用HasSet存储边,保证存储的边不会重复。如下代码:publicclassListGraphV,E{顶点的类privatestaticclassVertexV,E{。。。。。。}边的类privatestaticclassEdgeV,E{。。。。。。}存储顶点的属性privateMapV,VertexV,EverticesnewHashMap();存储边的属性privateSetEdgeV,EedgesnewHashSet();}
  代码中定义顶点和边的类上期的文章中已经存在,这里就不再重复展示。顶点边的数量
  图的类中,已经分别定义了存储顶点和边的属性变量,所以获取顶点或者边的数量可以直接转换到获取对应变量的size就可以了。边的数量publicintedgesSize(){returnedges。size();}顶点的数量publicintverticesSize(){returnvertices。size();}添加顶点
  在添加一个顶点前,需要先判断要添加的顶点是否已经在顶点集合中,如果不存在,才能添加到顶点集合中。因为Map中已经有判断某个元素是否已经在集合中的方法,所以不需要自定义实现,代码如下:publicvoidaddVertex(Vv){if(vertices。containsKey(v))VertexV,EvertexnewVertex(v);vertices。put(v,vertex);}添加边
  添加边的逻辑比添加顶点要多一些,首先要确定边的起始顶点(from)和结束顶点(to)。然后要将没有存储到顶点集合中的起始顶点结束顶点放到顶点集合中。最后将要添加的边的实例分别放到起始顶点的出度集合和结束顶点的进度集合中,也不要忘记把边放到存储边的集合中。
  边放到顶点中的策略是覆盖,即若顶点中已经存在该边,就先移除它,然后再添加新的边。这里可以使用HashSet的remove函数中返回的bool值,来判断起始顶点的边集合是否存在,进而做是否要删除结束顶点的边集合(这个点很巧妙)。代码如下:publicvoidaddEdge(Vfrom,Vto,Eweight){VertexV,EfromVertexvertices。get(from);if(fromVertexnull){fromVertexnewVertex(from);vertices。put(from,fromVertex);}VertexV,EtoVertexvertices。get(to);if(toVertexnull){toVertexnewVertex(to);vertices。put(to,toVertex);}EdgeV,EedgenewEdge(fromVertex,toVertex);edge。if(fromVertex。outEdges。remove(edge)){toVertex。inEdges。remove(edge);edges。remove(edge);}fromVertex。outEdges。add(edge);toVertex。inEdges。add(edge);edges。add(edge);}
  代码中可以看到要传入的参数还有weight,那么如果边是没有权值,就传入null。比如添加没有权值的边,可以使用下面的函数:publicvoidaddEdge(Vfrom,Vto){addEdge(from,to,null);}移除顶点
  删除顶点时,除了要删除这个顶点,也要删除顶点连接的边。大致逻辑是:要先将其移除出顶点集合;然后遍历顶点出度的边,找到边连接的另外一个顶点,在这个顶点的入度集合也删除这个边,最后在图中的边集合中也删除这个边。遍历顶点入度的边也是这样的处理。
  具体代码如下:publicvoidremoveVertex(Vv){删除顶点,通过remove机制处理VertexV,Evertexvertices。remove(v);if(vertexnull)使用迭代器的原因:在遍历的过程中也会存在删除数组中的元素顶点存在,且也删除,下面就是删除边使用迭代器for(IteratorEdgeV,Eiteratorvertex。outEdges。iterator();iterator。hasNext();){EdgeV,Eedge(EdgeV,E)iterator。next();edge。to。inEdges。remove(edge);删除vertex。outEdges中的边iterator。remove();edges。remove(edge);}for(IteratorEdgeV,Eiteratorvertex。inEdges。iterator();iterator。hasNext();){EdgeV,Eedge(EdgeV,E)iterator。next();edge。to。outEdges。remove(edge);删除vertex。outEdges中的边iterator。remove();edges。remove(edge);}}
  代码中使用迭代器遍历边,是因为在遍历的过程中也可能要删除边,遍历数组过程中要删除元素的场景都可以用迭代器实现。移除边
  删除边的逻辑就相对来说简单很多。先找到被边连接的顶点(包括起始顶点和结束顶点),然后分别将起始顶点的出度边集合中的边和结束顶点的进度边集合中的边移除,最后把图中存储边集合的边移除。这样就大功告成,代码如下:publicvoidremoveEdge(Vfrom,Vto){VertexV,EfromeVertexvertices。get(from);if(fromeVertexnull)VertexV,EtoVertexvertices。get(to);if(toVertexnull)EdgeV,EedgenewEdge(fromeVertex,toVertex);if(fromeVertex。outEdges。remove(edge)){toVertex。inEdges。remove(edge);edges。remove(edge);}}
  代码中会先判断边连接的顶点是否存在,如果其中一个顶点不存在,就认为该边也是不存在的,也就没有必要执行移除边的操作了。总结本期实现图结构的接口方法;删除边利用了函数中参数存在就返回true的方式来处理,是一个很巧妙的点;顶点中定义两个边集合分别存储出度和入度的边;一个边若存在,就一定有两个顶点。但是一个顶点存在,不一定会有边。
投诉 评论 转载

以EUHT技术支持8K超高清视频传输北京经开区打造全球首个户这个屏幕有好几层楼那么高,但播放的视频节目特别清晰细腻,超级震撼。2月4日,北京经开区大族广场前的8K大屏引起路过市民的关注。与此同时,北京经开区全资国有企业尚亦城集团在全市建……加码美国直播电商市场TikTok现金激励代运营账号打榜【亿邦动力讯】2月7日消息,TikTok已经启动了一项名为阿波罗计划的TikTokShoppingPartner激励政策,该政策主要针对美国地区的TikTokShopping电……6万人砍不下来一部手机?拼夕夕回应这样说自古真情留不住,唯有套路得人心。说起拼多多,想必大家都不陌生,谁还没收到过亲戚朋友发来的,帮忙砍一刀的消息呢?然而,拼多多的套路,那几乎是将消费者的智商按在地上摩擦……小米12mini曝光,6。3英寸小屏骁龙898,米粉又模仿苹现如今的智能手机,屏幕越来越先进的同时,也变得越来越大,除了苹果和三星之外,其它厂商的旗舰机型,屏幕尺寸几乎都在6。5英寸以上。对于游戏爱好者来说,手机的屏幕更大自然能带来更好……锐捷小兔子评测1200M速率WiFi放大器,支持跨品牌一键组随着5G的不断发展,互联网行业的应用也对带宽要求越来越高,家用带宽虽然基本上做到了百兆起步,然而单路由的限制,还是很难在全屋发挥出来全百兆带宽的能力,造成了客厅信号强,卧室信号……redis中的数据占用内存大小分析如今越来越来的系统中使用redis作为缓存系统,但是随着用户量的增长,业务数据不断增多,redis服务器的内存空间有可能会到瓶颈了,及时观察redis中的各种键内存占用多少,会……iPhone13曝光两种新配色,橙色和落日金,这是你的菜吗?【微创WEC科技】自从iPhoneXR推出后,iPhone每年都会推出一些新配色,当年,我就入手了一台蓝色的iPhoneXR,这台手机可谓是满足了我这个蓝色控的所有需求,虽然分……MagSafe外接电池的最佳替代品?南卡POW3充电宝每一代的iPhone在性能和体验方面总能给人留下出色的印象,但唯独就是在续航方面比较拉跨,等了好几代产品也没有改善的意思。前几天苹果推出了一款用Magsafe外接电池,通过吸附……什么蓝牙耳机好?测评师周良推荐五款口碑最好的蓝牙耳机如今智能手机能带3。5mm接口的是少之又少了,而且相对于有线耳机,很多年轻人更加青睐于真无线蓝牙耳机。毕竟蓝牙耳机更加便捷和时尚,但是面对着如此之多的蓝牙耳机品牌,价格差异又大……助力智慧城市建设与数据安全治理,欧科云链链上天眼展现区块链技鞭牛士报道随着国家新基建战略的全面展开和十四五规划的逐步实施,各行业都进入了数字化转型的加速期。其中建设智慧型城市作为数字经济的重要载体,也是全国多地打造发展战略新高地的重要抓……从山姆会员店的先例来看,会员制商超真的适合在国内发展吗?中国第一家山姆会员商店1996年就已经落地国内,但是以其为代表的会员制商超,在2016年后才突然出现逆势增长趋势。会员制商超真的适合在当前国内市场情况下发展吗?如何能够打造具备……数据结构与算法摘要本期通过实现图的接口函数,来进一步理解在代码中,图的结构是如何形成的,比如怎么定义边、如何定义顶点、如何定义边与顶点的连接关系等等。上期介绍了图的实现方案,以及……
独家揭秘总台如何硬核支持冬奥会开幕式为什么联想总是被人们骂?高颜值RGB装机配置XPG入侵者皓月版开箱体验任正非铮铮铁骨男人,也有不为人知的男儿泪日常碰到的一些事故隐患和事故(电气安装注意!)网吧那么多电脑为什么不卡?他们用的什么路由器?iPadmini6出现大面积果冻屏,遭集体诉讼?新机vivoX70系列跑分现身天玑1200骁龙888Plus华为Mate40Pro新售价已定,128GB版跌破4900,再度抨击拜登无视特斯拉!马斯克留话若被白宫邀请他会顾全大局科技巨头加码布局折叠屏买贵手机又怕吃亏,知道这几点,你也能轻松的成为半个内行人

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利