首页 > 其他分享 >说说你对图的理解?相关操作有哪些?

说说你对图的理解?相关操作有哪些?

时间:2024-04-19 17:47:21浏览次数:18  
标签:遍历 const 哪些 邻接矩阵 如下 理解 visited 操作 节点

一、是什么

在计算机科学中,图是一种抽象的数据类型,在图中的数据元素通常称为结点,V是所有顶点的集合,E是所有边的集合

如果两个顶点v,w,只能由vw,而不能由wv,那么我们就把这种情况叫做一个从 v 到 w 的有向边。v也被称做初始点,w也被称为终点。这种图就被称做有向图

如果vw是没有顺序的,从v到达w和从w到达v是完全相同的,这种图就被称为无向图

图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系

常见表达图的方式有如下:

  • 邻接矩阵

  • 邻接表

邻接矩阵

通过使用一个二维数组G[N][N]进行表示N个点到N-1编号,通过邻接矩阵可以立刻看出两顶点之间是否存在一条边,只需要检查邻接矩阵行i和列j是否是非零值,对于无向图,邻接矩阵是对称的

邻接表

存储方式如下图所示:

 在javascript中,可以使用Object进行表示,如下:

const graph = {
  A: [2, 3, 5],
  B: [2],
  C: [0, 1, 3],
  D: [0, 2],
  E: [6],
  F: [0, 6],
  G: [4, 5]
}

图的数据结构还可能包含和每条边相关联的数值(edge value),例如一个标号或一个数值(即权重,weight;表示花费、容量、长度等)

二、操作

关于的图的操作常见的有:

  • 深度优先遍历
  • 广度优先遍历

首先构建一个图的邻接矩阵表示,如下面的图:

 用代码表示则如下:

const graph = {
  0: [1, 4],
  1: [2, 4],
  2: [2, 3],
  3: [],
  4: [3],
}

深度优先遍历

也就是尽可能的往深处的搜索图的分支

实现思路是,首先应该确定一个根节点,然后对根节点的没访问过的相邻节点进行深度优先遍历

确定以 0 为根节点,然后进行深度遍历,然后遍历1,接着遍历 2,然后3,此时完成一条分支0 - 1- 2- 3的遍历,换一条分支,也就是4,4后面因为3已经遍历过了,所以就不访问了

用代码表示则如下:

const visited = new Set()
const dfs = (n) => {
  console.log(n)
  visited.add(n) // 访问过添加记录
  graph[n].forEach(c => {
    if(!visited.has(c)){ // 判断是否访问呢过
      dfs(c)
    }
  })
}

广度优先遍历

先访问离根节点最近的节点,然后进行入队操作,解决思路如下:

  • 新建一个队列,把根节点入队
  • 把队头出队并访问
  • 把队头的没访问过的相邻节点入队
  • 重复二、三步骤,知道队列为空

用代码标识则如下:

const visited = new Set()
const dfs = (n) => {
  visited.add(n)
  const q = [n]
  while(q.length){
    const n = q.shift()
    console.log(n)
    graph[n].forEach(c => {
      if(!visited.has(c)){
        q.push(c)  
        visited.add(c)
      }
    })
  }
}

三、总结

通过上面的初步了解,可以看到图就是由顶点的有穷非空集合和顶点之间的边组成的集合,分成了无向图与有向图

图的表达形式可以分成邻接矩阵和邻接表两种形式,在javascript中,则可以通过二维数组和对象的形式进行表达

图实际是很复杂的,后续还可以延伸出无向图和带权图,对应如下图所示:

参考文献

  • https://zh.wikipedia.org/wiki/%E5%9B%BE_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
  • https://www.kancloud.cn/imnotdown1019/java_core_full/2159607

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:遍历,const,哪些,邻接矩阵,如下,理解,visited,操作,节点
From: https://www.cnblogs.com/smileZAZ/p/18146521

相关文章

  • Delphi10.3开发的SQLite3的图形操作小软件
    链接:https://pan.baidu.com/s/1Glye61WgYd_wC0uOfx9ZoQ提取码:dqd9关键部份FDConnection1.GetTableNames('','','',ListBox1.Items);StringGrid1.Cells[1,i+1]:=FDMetaInfoQuery1.FieldByName('COLUMN_NAME').AsString;......
  • 小心!这些错误操作可能导致企业信息泄露!
    在当今的数字经济中,企业信息安全已成为保障公司持续运营的核心要素。每一个不经意的操作,都可能成为导致敏感信息泄露的关键。在这篇文章中,我们将聚焦于那些看似无害但实际上充满风险的日常操作,帮助企业识别并避免这些潜在的威胁。内部员工的不当行为是导致企业信息泄露的一个大......
  • 导数微分积分的粗浅理解
     我对这几个概念粗浅的理解:导数:对于一个方程:y=f(x),在某点的导数就是该点的切线的斜率,也即:f'(x)=dy/dx。对于P0点的导数,就是角度∂的tan值,但是一般也不容易计算,所以可以用lim求极限的方式,也即计算PP0线无限接近P0的tan角度的值。微分的定义可以粗略的人为是:dy=f'(x)dx......
  • 现有的后端开发语言有哪些?哪种语言用的广泛?
    在探讨后端开发语言时,我们首先要明确,这些语言是用于服务器端编程的工具,它们能够支持数据库管理、执行服务器逻辑以及维护安全性等关键功能。在这个领域,有多种语言可供选择,每种都有其独特的优势和适用场景。首先,我们要提到的是Java。这种语言的成熟度和广泛应用性使其在企业级应用......
  • 记录在JavaScript中对事件循环的理解
    JavaScript事件循环通俗解释好的,用更通俗的话来说,事件循环就像是在一个大剧院里,有一个演员(JavaScript引擎)和两个重要的角色:一个是前台的表演者(调用栈),另一个是后台的候场区(事件队列)。前台表演者:这个演员在前台表演,一次只能表演一个节目(单线程执行)。当一个节目(函数)开始时,演员就上......
  • 【面试准备】【SQL】数据库有哪些约束?
    数据库中的约束(constraints)是用来确保数据库中数据的准确性和可靠性的一种规则。以下是一些常见的数据库约束:PRIMARYKEY(主键):确保列的值是唯一的,并且不能为NULL。FOREIGNKEY(外键):用于在两个表之间建立链接,并确保引用的数据的完整性。UNIQUE(唯一):确保所有列的组合在表中是......
  • C#中堆和栈的区别,引用类型和值类型的区别,常见有哪些
    一、C#中堆和栈的区别堆和栈是计算机科学中两个非常重要的概念,它们主要区别在于管理方式、内存分配策略和应用场景不同。堆和栈都是存储数据的地方。-堆(Heap):堆是用于动态分配内存的区域,它是一个大型“池”,可以在其中分配和释放内存。堆的内存是动态分配的,可以在任何时候分配和......
  • ERP财务管理有哪些功能?如何选择合适的ERP软件开发商定制开发适合自己的ERP财务管理?
    企业日常运营中,分工明确、结构清晰的财务管理非常重要,因此在完整的ERP解决方案中,财务管理是不可或缺的部分,甚至财务管理是整个ERP解决方案的核心,其它功能模块都围绕着财务管理构建价值链创造流程,最大化利用企业资源来创造价值。设计合理的ERP系统,财务管理和其它模块会有相应接......
  • JavaScript本地存储的方式有哪些
    Web存储技术1.localStorage特点:长期存储,除非手动删除否则会一直保存在浏览器中,清除缓存或卸载浏览器后消失。存储语法:window.localStorage.setItem(名字,值)获取语法:window.localStorage.getItem(名字)删除语法:window.localStorage.removeItem(名字)作用:删除localStorage......
  • C#的窗体假关闭操作例子 - 开源研究系列文章
          晚上编码的时候,想到了以前编写的窗体关闭的事情,就是带托盘图标的应用,有一个主显示操作窗体,但是主窗体点击关闭按钮的时候,实际上是窗体隐藏而非真正关闭,这个在其它的一些应用程序里有这个效果。于是就想到了这个例子,记录下来,如果其他读者也有这个问题,那直接复用此例子......