热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

数据结构(四)图(Graph)

在图形结构中,结点之间的关系可以是任意的。一、图图由定点(vertex)和边(edge)两个有限集合组成:Graph(V,R)V是定点集,R{E},E是边集。

   在图形结构中,结点之间的关系可以是任意的。

一、图

  图由定点(vertex)和边(edge)两个有限集合组成:

Graph=(V,R)

  V是定点集,R={E},E是边集。

  有向图(directed network):从一个顶点指向另一个顶点。用有序对表示

  无向图:用无序对(u,v)代替有序对。

  有向网:有向图的边上有正的权值。

  无向网:无向图的边上有正的权值。

 

  n为图中顶点数,e为图中边数,不考虑顶点到自身的边:

  (1)对无向图而言, e在[0,n(n+1)/2]范围内。满边称为完全图;

  (2)对有向图,e在[0,n(n-1)],满边称为有向完全图。

  有较少条边的图称为稀疏图,有较多条边的图称为稠密图。

 

  图中顶点的度degree:

  无向图中即为与顶点相关联的边的数目;

  有向图中:顶点有入度和出度,顶点的度数为两者之和。

 

  图中路径的定义:顶点序列中,任意序列相邻顶点的构成的边都存在,则称顶点序列构成一条长度为n-1的路径,路径长度是指包含的边的条数。

  如果路径上各个顶点都不同,则为简单路径。

  路径中如果首尾的顶点是同一个,则构成回路。

  一条回路中,除了起点与终点相同外,其它顶点都不相同,则为简单回路,或简单环

 

  一个无向图中任意两个不同的顶点都存在从一个顶点到另一个顶点的路径,则称此无向图是联通的(connected),无向图的极大联通子图称为联通分量

  对于有向图,如果一个有向图中任意两个不同的顶点u和v,都存在从顶点u到顶点v的路径,则称此有向图是强连通的,有向图的极大联通子图称为强连通分量。

 

  连通图的极小连通子图称为连通图的生成树,生成树包含图中全部n个顶点,只有n-1条边,并且任加新一条边,必将构成回路。

 

 

二、图的存储

  最常用的两种:邻接矩阵和邻接表。

 

三、图的遍历

         图的遍历算法一般是从一个起始顶点出发,试图访问全部顶点,则必须解决:

  (1) 从起点出发可能到达不了所有其它顶点(如非连接图);

  (2) 有些图存在回路,必须确定算法不会因回路而陷入死循环。

  解决办法是,为图的每个顶点保留一个标志(tag),在算法开始时,所有顶点的标志设置为false,遍历过程中,如某个顶点被访问,则置为true。后面再遇到tag为true 的点,就不访问,避免陷入死循环。

  若图是不联通的,则还有未被访问的顶点,这些顶点的标志值为false,这时可以从某个未被访问到的顶点开始继续搜索。

 

         深度优先搜索DFS:

         搜索过程中,每当访问某个顶点V后,DFS将递归地访问它的所有未被访问到的邻接的顶点,实际结果是沿着图的某一分支进行搜索,直到末端,再进行回溯,沿另一分支进行搜索。结果将产生一棵深度优先搜索树。

         时间复杂度与图的存储结构有关,主要花费在对每个顶点寻找邻接点的过程上。

 

         广度优先搜索BFS:

         以顶点V为起点,由近至远依次访问和V有路径相通且长度为1,2,…的顶点,知道所有被访问的顶点的邻接点都被访问完。若这时图中还有未被访问的顶点,选择一个未被访问的顶点作为起始点继续进行搜索,直到图中所有顶点都被访问完为止。

         时间复杂度是一样的。

 

                             

四、连通无向网的最小代价生成树

  最小代价生成树MST,对于一个给定连通网Net,最小代价生成树包括Net中所有顶点和部分边,且满足下列条件:

  (1)    MST边的条数是顶点个数减1,并且保证MST是连通的;

  (2)    MST边上的权值之和最小。

 

  构造最小代价生成树的两种算法:

  Prim算法——直到有n-1条边(从顶点出发);

  Kruskal算法——直到所有的顶点在同一颗树上(从边入手);

 

五、有向无环图(Direxted Acyclic Graph)

         判断有向无环图:拓扑排序or深度优先搜索,DFS(v)结束之前出现一条从顶点u到v的回边,则必定存在包含顶点u和v的回路。

  1、  拓扑排序

  2、  关键路径

 

六、最短路径

  1、 单源点最短路径问题

  2、 所有顶点之间的最短路径问题

 


推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文深入探讨了二叉搜索树(Binary Search Tree, BST)及其操作,包括查找、插入和删除节点。同时,文章还介绍了平衡二叉树(AVL树)的概念及调整方法,并详细讨论了如何判断两个序列是否构成相同的二叉搜索树。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解Java中的Collection接口与Collections工具类
    本文详细解析了Java中Collection接口和Collections工具类的区别与联系,帮助开发者更好地理解和使用这两个核心组件。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 堆是一种常见的数据结构,广泛应用于计算机科学领域。它通常表示为一棵完全二叉树,并可通过数组实现。堆的主要特性是每个节点的值与其父节点的值之间存在特定的关系,这使得堆在优先队列和排序算法中非常有用。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文深入探讨了一家企业的制度体系重构与升级过程,通过具体案例展示了如何在战略意图和管理理念指导下,系统性地提升企业管理制度的有效性和可操作性。 ... [详细]
  • 近期遇到电脑网络不稳定和游戏时频繁重启的问题,寻求专业建议。网络环境为ADSL调制解调器通过路由器共享给两台电脑使用,怀疑存在ARP攻击或硬件配置问题。希望获得详细的故障排查和解决方案。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
author-avatar
fishandyp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有