每日学习一个数据结构-图

news2024/10/8 21:13:54

文章目录

    • 图基础
      • 一、图的定义
      • 二、图的相关概念
      • 三、图的分类
      • 四、图的使用场景
    • 和图相关的算法
      • 一、图的遍历算法
      • 二、最短路径算法
      • 三、最小生成树算法
      • 四、图匹配算法
      • 五、网络流算法

图基础

一、图的定义

在数学中,图是描述于一组对象的结构,其中某些对象对在某种意义上是“相关的”。这些对象对应于称为顶点的数学抽象(也称为节点或点),并且每个相关的顶点对都称为边(也称为链接或线)。通常,图形以图解形式描绘为顶点的一组点或环,并通过边的线或曲线连接。图(Graph)是由顶点的有穷非空集合和顶点之间的连线(边)的集合组成,通常表示为G=(V, E),其中G表示一个图,V(G)代表图G中的顶点集合,E(G)代表图G中的边集合。

二、图的相关概念

  1. :图G中点集V的大小称作图G的阶。

  2. 子图:当图G’=(V’,E’),其中V’包含于V,E’包含于E,则G’称作图G=(V,E)的子图。每个图都是本身的子图。

  3. 生成子图:指满足条件V(G’)=V(G)的G的子图G’。

  4. 导出子图

    • 以图G的顶点集V的非空子集V1为顶点集,以两端点均在V1中的全体边为边集的G的子图,称为V1导出的导出子图。
    • 以图G的边集E的非空子集E1为边集,以E1中边关联的顶点的全体为顶点集的G的子图,称为E1导出的导出子图。
  5. :一个顶点的度是指与该顶点相关联的边的条数,顶点v的度记作d(v)。

  6. 入度和出度:对于有向图来说,一个顶点的度可细分为入度和出度。一个顶点的入度是指与其关联的各边之中,以其为终点的边数;出度则是相对的概念,指以该顶点为起点的边数。

  7. 自环:若一条边的两个顶点为同一顶点,则此边称作自环。

  8. 路径:从u到v的一条路径是指一个序列v0,e1,v1,e2,v2,…ek,vk,其中ei的顶点为vi及vi-1,k称作路径的长度。如果它的起止顶点相同,该路径是“闭”的,反之,则称为“开”的。

  9. 简单路径:如果路径中除起始与终止顶点可以重合外,所有顶点两两不等,则称为简单路径。

  10. 行迹:如果路径P(u,v)中的边各不相同,则该路径称为u到v的一条行迹。

  11. 轨道:如果路径P(u,v)中的顶点各不相同,则该路径称为u到v的一条轨道。

  12. 回路和圈:闭的行迹称作回路(Circuit),闭的轨称作圈(Cycle)。

  13. :若去掉一条边,便会使得整个图不连通,该边称为桥。

三、图的分类

  1. 无向图和有向图

    • 无向图:边没有方向的图。在无向图中,边记作(vi,vj),它蕴涵着存在< vi,vj>和< vj,vi>两条弧。若无向图中有n个顶点,则最多有n(n-1)/2条弧。
    • 有向图:给图的每条边规定一个方向得到的图。在有向图中,边称作弧,含箭头的一端称为弧头,另一端称为弧尾。在有向图中,路径也是有向的。
  2. 简单图、多重图、完全图

    • 简单图:图中若不存在顶点到其自身的边,并且同一条边不会重复出现,这种图称为简单图。简单图分为简单无向图和简单有向图。
    • 多重图:图中某两个顶点之间的边数多于一条,或者顶点通过一条边和自己关联,这种图称为多重图。多重图分为多重无向图和多重有向图。数据结构中所讨论的图一般都是简单图。
    • 完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边。在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。含有n个顶点的有向完全图有n(n-1)条边。
  3. 稀疏图和稠密图:有很少条边或者弧的图称为稀疏图,反之称为稠密图。稀疏和稠密都是相对而言的,并不是一个精确的数值。

四、图的使用场景

图是一种非常重要的数据结构,在多个领域都有广泛的应用:

  1. 计算机科学:图论被广泛应用于算法设计中,如最短路径算法、网络流算法等。此外,图还是许多数据结构的基础,如邻接表、邻接矩阵等。
  2. 工程领域:在电路设计中,图可以用来表示电路元件之间的连接关系;在机械设计中,图可以用来表示零件之间的装配关系。
  3. 社会学:在社会网络分析中,图可以用来表示人与人之间的社会关系,如朋友关系、合作关系等。
  4. 生物学:在生物信息学中,图可以用来表示基因之间的相互作用关系、蛋白质之间的相互作用关系等。
  5. 经济学和金融学:图可以用来表示不同经济实体之间的交易关系、投资关系等。
  6. 地理信息系统:在GIS中,图可以用来表示地理实体之间的空间关系,如城市之间的交通网络、河流的流向等。

总的来说,图作为一种强大的工具,在各个领域都发挥着重要的作用。通过构建和分析图,人们可以更好地理解和解决复杂的问题。

和图相关的算法

图是一种重要的数据结构,由顶点(或节点)和边组成,用于表示对象及其相互之间的关系。以下是与图相关的一些经典算法:

一、图的遍历算法

  1. 广度优先搜索(BFS)
    search-width

    • 从起始节点开始,先访问所有相邻的节点,再依次访问这些相邻节点的未访问过的相邻节点,直到所有节点都被访问过。
    • 适用于寻找最短路径(未考虑边权)等问题。
    • 实现时通常使用队列数据结构。
  2. 深度优先搜索(DFS)
    search-deep

    • 从起始节点开始,沿着一个分支尽可能深地搜索,直到该分支的末端,然后回溯到上一个节点,继续搜索其他未访问的分支。
    • 适用于解决连通性问题、路径查找、图的遍历等问题。
    • 可以通过递归或显式栈来实现。
  3. A*算法

    • 启发式搜索算法,使用启发式函数来评估从源节点到目标节点的路径成本。
    • 通过优先队列来选择下一个要访问的节点,以找到最短路径。
    • 估值函数f(n)=g(n)+h(n),其中g(n)是从起始搜索点到当前点的代价,h(n)是当前结点到目标结点的估值。

二、最短路径算法

  1. Dijkstra算法

    • 解决单源最短路径问题,即求出给定顶点到其他任一顶点的最短路径。
    • 适用于加权图,且图中不包含负权边。
    • 算法依据最短路径的最优子结构性质,从起点开始,每一步都走最短的路径,并不断更新每个点到起点的最短距离。
  2. Bellman-Ford算法

    • 解决含负权图的单源最短路径问题。
    • 通过连续进行松弛操作来更新最短路径估计值。
    • 如果在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果。
  3. Floyd-Warshall算法

    • 解决任意两点间的最短路径问题。
    • 适用于所有类型的图,包括有向图和带负权边的图。
    • 算法通过考虑最佳子路径来得到最佳路径,使用邻接矩阵来储存边。

三、最小生成树算法

  1. Prim算法

    • 在加权连通图中搜索最小生成树。
    • 从任意一个顶点开始,逐步扩展生成树,每次选择权值最小的连接新顶点和生成树中顶点的边。
  2. Kruskal算法

    • 另一种求加权连通图的最小生成树的算法。
    • 基于贪心策略,首先将所有边按权值从小到大排序,然后依次选择边,如果选择的边不会形成环,则将其加入生成树中。

四、图匹配算法

  • 匈牙利算法

    • 在多项式时间内求解任务分配问题的组合优化算法。
    • 用于求解指派问题(assignment problem),算法时间复杂度为O(n^3)。
    • 适用于二分图的最大匹配问题。

五、网络流算法

  • Ford-Fulkerson算法

    • 用于计算流网络中的最大流量。
    • 流网络是一个有向图,其中每条边都有一个非负容量。
    • 算法通过寻找增广路径来不断更新流量,直到无法再找到增广路径为止。

这些算法在图论和网络分析中有着广泛的应用,包括网络路由、社交媒体分析、推荐系统等领域。根据具体问题的需求和图的结构特性,可以选择合适的算法来解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构单向链表

单向链表的转置 转置的思想&#xff1a; (1) 将头节点与当前链表断开&#xff0c;断开前保存下头节点的下一个节点&#xff0c;保证后面链表能找得到&#xff0c;定义一个q保存头节点的下一个节点&#xff0c;断开后前面相当于一个空的链表&#xff0c;后面是一个无头的单向链表…

动态内存管理练习题的反汇编代码分析(底层)

1.C语言代码 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 2.反汇编代码 VS2022x64debug #include <stdio.h>…

给普通的div或者view等元素添加onblur事件的方式

一般只有input元素有blur事件&#xff0c;但是如果想给普通的元素设置了blur事件之后&#xff0c;它是不会正常直行的。还需要再给元素添加tabindex属性&#xff0c;设置了tabindex属性之后&#xff0c;元素会带有一个下划线&#xff0c;还要去掉下划线&#xff0c;而且聚焦的时…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;其架构具有以下特点&#xff1a; 一、客户端/服务器架构 客户端 客户端可以是各种应用程序&#xff0c;如 Web 应用、桌面应用等&#xff0c;它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

力扣之603.连续空余座位

文章目录 1. 603.连续空余座位1.1 题干1.2 准备数据1.3 思路分析1.4 解法1.5 结果截图 1. 603.连续空余座位 1.1 题干 表: Cinema ----------------- | Column Name | Type | ----------------- | seat_id | int | | free | bool | ----------------- Seat_id 是该表的自动递…

2024-你自学网络安全的顺序可能一直是反的!

作为一名在网络安全领域工作了八年的技术人员&#xff0c;我想分享一些经验给2024年学习黑客技术的朋友们。 千万不要毫无基础就开始学黑客!一定要先了解相关的信息和知识! 对于刚入行的朋友&#xff0c;我建议先从网络安全或Web安全/渗透测试入手&#xff0c;这些方向市场需求…

【可答疑】基于51单片机的光照强度检测(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

基于STM32的智能仓库温湿度监控系统设计

引言 本项目设计了一个基于STM32的智能仓库温湿度监控系统&#xff0c;能够实时监测仓库内的温度和湿度&#xff0c;并根据设定的阈值触发报警或启动风扇调节环境。该系统通过DHT11温湿度传感器获取环境数据&#xff0c;结合OLED显示屏、风扇和蜂鸣器&#xff0c;实现对仓库环…

python中的数组模块numpy(一)(适用物联网数据可视化及数据分析)

一、创建数组对象array&#xff0c;认识数组的格式 array函数的格式:np.array(object,dtype,ndmin) 以下是示例代码&#xff1a; # coding:utf-8 import numpy as np d1[1.1,2.1,3.1] d2(1,2,3,4) d3[[a,b],[c,d],[e,f]] print(d1) print(d2) print(d3) print("以上是数…

无法编辑PDF文件?试试这3个解决方法!

PDF文件格式广泛应用于工作中&#xff0c;但有时候我们可能遇到无法编辑PDF文件的情况。这可能导致工作效率降低&#xff0c;特别是在需要修改文件内容时显得尤为棘手。遇到PDF不能编辑时&#xff0c;可以看看是否以下3个原因导致的。 原因一&#xff1a;PDF文件设置了编辑权限…

八大排序--06基数排序(桶排序)

【本质--先排序个位&#xff0c;再排序十位&#xff0c;排百位...依次类推的过程】 获取待排序数组中的最高位数 //取计算最大值的位数int maxarr[0];for(int j0;j<arr.length;j) {if(arr[j]>max) {maxarr[j];}} 存储数据&#xff08;桶排序中除了游标遍历外&#xff…

【数据结构 | PTA】栈

文章目录 7-1 汉诺塔的非递归实现7-2 出栈序列的合法性**7-3 简单计算器**7-4 盲盒包装流水线 7-1 汉诺塔的非递归实现 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记…

分析和解决js运算精度问题,出现多位小数

加减乘除都会出现小数精度错误的问题 (见图) 原因&#xff1a;js进行运算时会将数字先转为二进制再进行运算。 错误思路&#xff1a;之前在做数字运算时都是将数字转化为整数再进行运算&#xff0c;某次突然发现在变整数的时候也会出现精度问题&#xff0c;比如上图中的数据。…

LINUX——内核移植、内核编译教程

Linux内核编译是一个将内核源代码转换成可在特定硬件架构上运行的二进制文件的过程。以下是编译Linux内核的一般步骤&#xff1a; 1、准备工作&#xff1a; 确保安装了必要的编译工具&#xff0c;如gcc、make、ncurses库&#xff08;用于make menuconfig&#xff09;等。 2、…

【读书笔记-《30天自制操作系统》-26】Day27

本篇内容不多&#xff0c;主要是一些优化的工作。首先优化了应用程序&#xff0c;然后引入对应用程序的保护功能&#xff0c;最后引入库的概念。 1. 应用程序优化 首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序&#xff0c;按下ShiftF1或者点击x按钮都无法关…

Hierarchical Cross-Modal Agent for Robotics Vision-and-Language Navigation

题目&#xff1a;用于视觉语言导航的层次化跨模态智能体 摘要 1. 问题背景和现有方法 VLN任务&#xff1a;这是一种复杂的任务&#xff0c;要求智能体基于视觉输入和自然语言指令进行导航。 现有方法的局限性&#xff1a;之前的工作大多将这个问题表示为离散的导航图&#x…

『网络游戏』登陆启动框架【05】

将上一章的加载界面隐藏 1.游戏启动逻辑 创建脚本GameRoot.cs &#xff08;该脚本为游戏入口&#xff0c;作用初始化游戏&#xff09; 创建脚本&#xff1a;ResSvc.cs &#xff08;&#xff09; 创建脚本&#xff1a;LoginSys.cs &#xff08;&#xff09; 编写脚本&a…

解析Vue源码中是如何进行模版编译的

模版编译 联系前文&#xff0c;讲了虚拟DOM的patch过程&#xff0c;而虚拟DOM的前提是先有VNode&#xff0c;那么VNode又是从哪里来的&#xff1f;接下来讲的模版编译便是&#xff1a;把用户写的模版进行编译&#xff0c;就会产生VNode。 在日常开发中&#xff0c;我们把写在…

Qt-目录和文件

1. 目录和文件 1.1 目录操作 QDir 类用来处理目录 常用方法&#xff1a; QDir(QString path) &#xff1a; 实例化 absolutePath() : 获取目录绝对路径 dirName() : 获取目录相对路径 exists(dirPath) : 判断目录是否存在 mkdir(QString dirPath) : 创建目录 rmdir(QStr…

经典5级流水线概述

抽象化的流水线结构&#xff1a; 流水线的基本概念 多个任务重叠&#xff08;并发/并行&#xff09;执行&#xff0c;但使用不同的资源流水线技术提高整个系统的吞吐率&#xff0c;不能缩短单个任务的执行时间其潜在的加速比&#xff1d;流水线的级数 流水线正常工作的基本条件…