范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

数据结构与算法

  摘要
  本期通过实现图的接口函数,来进一步理解在代码中,图的结构是如何形成的,比如怎么定义边、如何定义顶点、如何定义边与顶点的连接关系等等。
  上期介绍了图的实现方案,以及图的接口,顶点的结构类,边的结构类等。本期继续实现图的接口。准备
  首先创建一个图的类,定义顶点和边的类放在图的类中,还要定义存储顶点和边的属性。这里使用 HashMap 存储顶点,可以快速找到某一个顶点,使用 HasSet 存储边,保证存储的边不会重复。如下代码:public class ListGraph {     // 顶点的类     private static class Vertex {......}     // 边的类     private static class Edge {......}     // 存储顶点的属性     private Map> vertices = new HashMap<>();     // 存储边的属性     private Set> edges = new HashSet<>(); }
  代码中定义顶点和边的类上期的文章中已经存在,这里就不再重复展示。顶点/边的数量
  图的类中,已经分别定义了存储顶点和边的属性变量,所以获取顶点或者边的数量可以直接转换到获取对应变量的 size 就可以了。// 边的数量 public int edgesSize() {     return edges.size(); } // 顶点的数量 public int verticesSize() {     return vertices.size(); }添加顶点
  在添加一个顶点前,需要先判断要添加的顶点是否已经在顶点集合中,如果不存在,才能添加到顶点集合中。因为 Map 中已经有判断某个元素是否已经在集合中的方法,所以不需要自定义实现,代码如下:public void addVertex(V v) {     if (vertices.containsKey(v)) return;     Vertex vertex = new Vertex<>(v);     vertices.put(v, vertex); }添加边
  添加边的逻辑比添加顶点要多一些,首先要确定边的起始顶点(from)和结束顶点(to)。然后要将没有存储到顶点集合中的起始顶点/结束顶点放到顶点集合中。最后将要添加的边的实例分别放到起始顶点的出度集合和结束顶点的进度集合中,也不要忘记把边放到存储边的集合中。
  边放到顶点中的策略是覆盖,即若顶点中已经存在该边,就先移除它,然后再添加新的边。这里可以使用 HashSet 的 remove 函数中返回的 bool 值,来判断起始顶点的边集合是否存在,进而做是否要删除结束顶点的边集合(这个点很巧妙)。代码如下:public void addEdge(V from, V to, E weight) {     Vertex fromVertex = vertices.get(from);     if (fromVertex == null) {         fromVertex = new Vertex<>(from);         vertices.put(from, fromVertex);     }      Vertex toVertex = vertices.get(to);     if (toVertex == null) {         toVertex = new Vertex<>(to);         vertices.put(to, toVertex);     }      Edge edge = new Edge<>(fromVertex, toVertex);     edge.weight = weight;     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。比如添加没有权值的边,可以使用下面的函数:public void addEdge(V from, V to) {     addEdge(from, to, null);         }移除顶点
  删除顶点时,除了要删除这个顶点,也要删除顶点连接的边。大致逻辑是:要先将其移除出顶点集合;然后遍历顶点出度的边,找到边连接的另外一个顶点,在这个顶点的入度集合也删除这个边,最后在图中的边集合中也删除这个边。遍历顶点入度的边也是这样的处理。
  具体代码如下:public void removeVertex(V v) {     // 删除顶点,通过 remove 机制处理     Vertex vertex = vertices.remove(v);     if (vertex == null) return;      // 使用迭代器的原因:在遍历的过程中也会存在删除数组中的元素     // 顶点存在,且也删除,下面就是删除边 -- 使用迭代器     for (Iterator> iterator = vertex.outEdges.iterator(); iterator.hasNext();) {         Edge edge = (Edge) iterator.next();         edge.to.inEdges.remove(edge);         // 删除 vertex.outEdges 中的边         iterator.remove();         edges.remove(edge);     }     for (Iterator> iterator = vertex.inEdges.iterator(); iterator.hasNext();) {         Edge edge = (Edge) iterator.next();         edge.to.outEdges.remove(edge);         // 删除 vertex.outEdges 中的边         iterator.remove();         edges.remove(edge);     }  }
  代码中使用迭代器遍历边,是因为在遍历的过程中也可能要删除边,遍历数组过程中要删除元素的场景都可以用迭代器实现。移除边
  删除边的逻辑就相对来说简单很多。先找到被边连接的顶点(包括起始顶点和结束顶点),然后分别将起始顶点的出度边集合中的边和结束顶点的进度边集合中的边移除,最后把图中存储边集合的边移除。这样就大功告成,代码如下:public void removeEdge(V from, V to) {     Vertex fromeVertex = vertices.get(from);     if (fromeVertex == null) return;     Vertex toVertex = vertices.get(to);     if (toVertex == null) return;      Edge edge = new Edge<>(fromeVertex, toVertex);     if (fromeVertex.outEdges.remove(edge)) {         toVertex.inEdges.remove(edge);         edges.remove(edge);     } }
  代码中会先判断边连接的顶点是否存在,如果其中一个顶点不存在,就认为该边也是不存在的,也就没有必要执行移除边的操作了。总结本期实现图结构的接口方法;删除边利用了函数中参数存在就返回 true 的方式来处理,是一个很巧妙的点;顶点中定义两个边集合分别存储出度和入度的边;一个边若存在,就一定有两个顶点。但是一个顶点存在,不一定会有边。

还在手抄错题?学霸告诉你这样做!喵喵错题3秒搞定更能举一反三人的一生,是不断学习的过程,学习没有一蹴而就的捷径,但良好的学习习惯还是能让我们的效率和成效提升不少,这其中错题整理,反复学习易错点和举一反三巩固,都是被大家所认可且行之有效的方法何须等到618?3月14日京东云米品牌节便是出手好时机提起家中使用频率最高的家电,冰箱和洗衣机毫无疑问位列前三。而说到每年冰洗家电的热销期,除了众所周知的618和双11以外,实际上还有眼下的3月。尤其是在每年315前后,通常各大家电厂智能手表的心率只是参考更科学实时的心率监测咕咚心率带健康生活,倡导运动,但运动也是需要循序渐进,讲究科学的方式方法。尤其不能因为一时的三分钟热度,操作过度,导致身体拉伤或者机能损伤,那就得不偿失了。一般在运动过程中,最简单直观的身体直击2021智博会系列活动首届长安汽车科技生态大会发布新汽车新生态战略8月23日,2021中国国际智能产业博览会(以下简称智博会)在重庆盛大开展,本届智博会主要系列活动之一的2021长安汽车科技生态大会也于8月24日盛大开幕。2021长安汽车科技生态年轻人的第一辆智能轿跑思皓曜将于成都车展开启预售国内1015万元家用轿车市场呈现轿跑化性能化趋势,近期几款热门轿车的亮相和上市都展现了这一特点目前,又一款智能轿跑思皓曜,闪耀亮相,为这个热门市场增添了新活力思皓曜也将在成都车展正跨界联动解锁造车新方式成都车展看R汽车如何用科技兑现想象第二十四届成都国际汽车展览会(以下简称成都车展)将于8月29日正式拉开帷幕,R汽车将携长途智联网纯电家轿ER6智能电动SUVMARVELR以及智慧新物种ES33齐聚蓉城,为川渝地区新突破!哪吒汽车第60000台整车正式下线哪吒UPro订单过万供不应求8月21日,哪吒汽车在位于浙江桐乡的全生态智慧工厂举行第60000台整车下线仪式。桐乡市市长于会游,桐乡市常务副市长蔡立新,桐乡经济开发区党工委书记屠建忠等政府领导出席仪式,共同见重磅!哪吒汽车与华为开启全面合作中国技术构筑智能出行新征程2021年8月25日,合众新能源汽车有限公司(以下简称哪吒汽车)与华为技术有限公司(以下简称华为)签署全面合作协议。此次合作,双方将秉承资源互补优势叠加互利共赢共促发展的战略目标,一大波新品来袭!九号公司在天津展上放了个大招今天(3月26日)第二十届中国北方国际自行车电动车展如期而至,作为全球智能短交通和服务类机器人领域的创新科技企业九号公司迎来了自己的天津展首秀。对于这场大秀,九号公司明显做足了准备高端旗舰就该这么溢价,魅族18系列打造真正的高端体验相信很多朋友在使用手机时都发现了一个问题,那就是如今除了苹果之外,安卓的绝大部分手机甚至是高端旗舰都加入了不同程度的广告,这对于广大消费者来说是一件极其不友好的事情,更有甚者,他们行业最领先!海尔智家发布UhomeOS3。0独有智家大脑如今,智能家居企业越来越多,他们在操作系统这项关键技术上的竞争也越来越激烈,为什么海尔智家能做到最领先?3月22日,海尔智家在上海召开以让家更智慧为主题的开发者大会,发布行业唯一面
最新版Windows10找不到便利贴(便笺)的解决办法在旧版本的Windows10中,我们可以通过组合快捷键Windows徽标键W,按下组合键后,便笺会在屏幕右侧显示出来但是,在最新版Windows10系统的附件里已经找不到了。如上图如何搞定流氓软件FF新推荐(Flash助手推荐)广告弹窗电脑盒盖睡眠后,再次打开,居然在桌面正中央出现了一个广告弹窗软件。赤裸裸地挑衅呀。电脑界的牛皮癣,也是效仿了鹅厂的弹窗。如上图作为一名老IT,怎能忍受这种欺负。解决方法之一在弹窗右图文教程WindowsWIM格式镜像添加USB3。0或NVME驱动的步骤我今天要分享的这个case其实已经老生常谈的话题了,不新鲜了,再重复一次吧。简单说一下问题的背景。作为IT人士,在Windows7装系统时可能会遇到USB键盘鼠标无法使用的情况,失Windows10多合一系统安装镜像分享,内置21个版本,请勿商用基于windows101809190319092004家庭版专业版教育版专业教育版专业工作站版企业版LTSC2019的21合1镜像封装发布了。声明禁止用于商业用途,仅供个人技术研究不想一辈子给别人打工,中年油腻80后要认认真真创业搞副业了如题,我不是最早的一批80后,也不是最晚的一批80后。在80到85之间。就算最晚的一批80后,1989年,也31岁了,最早的一批80后,40岁了。80后们逐渐被后浪拍在沙滩上。80创建日内交易系统有关自动日内交易你需要了解的7件事日内的自动交易可能是日内交易最有趣的方式之一。它常常给人带来敬畏和神秘。这在一定程度上是因为算法交易高频交易等术语在主流媒体中被广泛使用。事实上,自动交易并没有什么令人惊叹的地方。WDS如何为boot。wim或install。wim添加驱动问题描述使用WDS为某些机型部署系统时,可能会出现无法引导的情况,比如某一款笔记本PXE引导后会弹出提示WdsClient从DHCP服务器获取IP地址时出错。请检查以确保在此网络段经纪商FXTM与FPMarkets被大马证监会列入黑名单2月3日,马来西亚金融管理机构证券委员会(SC)在其官网和官方社交媒体上发布新一轮投资警告,将10家投资主体列入警告黑名单,其中包括零售外汇及差价合约经纪商OctaFXFXTM以及理解交易中最值得信赖和可靠的理论之一威科夫交易法在传奇技术分析师的神殿中,或许没有人比理查德威科夫(RichardWyckoff)更高。威科夫在20世纪初观察市场时,首创了一种技术分析方法,至今仍被交易员广泛使用。威科夫理论是选高盛提醒等待拜登施政福利,别急于抛售白银在监管机构祭出措施限制白银爆炒浪潮后,银价自七年多高点回落,期货白银重新回到30美元下方现货白银目前在每盎司26。60美元附近交投。高盛集团(GoldmanSachs)大宗商品首席鳄王达利奥未来比特币或将被其他更好的加密货币代替有鳄王之称的全球最大对冲基金桥水(BridgewaterAssociates)创始人达利奥(RayDalio)最新撰文指出,比特币是一个了不起的发明,但相信将来会有更好的加密货币去