首页 > 其他分享 >数据结构-图

数据结构-图

时间:2023-03-19 21:23:15浏览次数:33  
标签:遍历 出度 路径 最短 集合 顶点 数据结构

1.图的概念

  • 基础概念

    • 顶点集合(vex-set):如上图 S(vex) =

    • 集合(arc-set):如上图 S(arc) =

    • (degree):⽆向图中从⼀个点延伸出去的边数就是该点的度;有向图中包含出度和⼊度;

      • 出度(out-degree):有多少条边指向某点就是该点的出度;
      • ⼊度(in-degree):从某点出发向外指向延伸的边数就是该点的⼊度;
  • 图的分类:有向图,无向图,权重图

    • 有向图
    • 无向图
    • 权重图
  • 图的储存

    • 存储的关键是点集合边集合

    • 使用邻接矩阵储存:顶点信息存储在⼀维数组中,边信息存储在⼆维数组中(不常用)

      • 优点和缺点
        • 优点:很容易算出边邻接关系;以及节点的度(不管是出度还是⼊度)
        • 缺点:边集合存储空间复杂度⽐较⼤,图中⼤量0,空间利⽤率不⾼(尤其在点多边少的情况下);对于⽆向图,邻接矩阵是对称的,可以只存下半部分。
    • 使用连接表储存(常用):顶点集合依然存储在⼀维数组当中,边集合存储在连接表当中;

      • 优点和缺点:
        • 优点:很容易算出邻接关系;以及节点的出度;
        • 缺点:很难算出⼊度,需要遍历整张表;
        • 因此可以同时建⽴⼀张逆连接表(相当于记录⼊度的表);
      • 有向图
      • 无向图
      • 权重⽆向图

2.图的遍历方式

  • 从图中某⼀个顶点出发,访问图中其余顶点,使每个顶点被访问⼀次且只被访问⼀次 -》保证不重不漏

  • 可以从图中任意⼀个顶点出发进⾏遍历;

  • 需要解决的问题:

    • 确定⼀条搜索路径;、
    • 确保每个顶点被访问到;
    • 确保每个顶点只能被访问⼀次;
  • 设置辅助数组visited,数组元素的初始值均为false,⼀旦遍历过就置为true;进行回溯

  • 深度优先遍历dfs

    • 关键数据结构:栈;
    • 应用
      • 检测连通分量的个数;连通分量:是两个图之间没有任何边的联系
      • 两个点是否在⼀个连通分量中;
      • 检测是否构成环;从⼀个点出发能否回到出发点; -》只有出度不能构成环
  • 广度优先遍历bfs

    • 关键数据结构:队列;
    • 应用
      • 游戏中找寻路径问题;
  • 迪杰斯特拉算法(dijkstra) -》计算最小权重值

    • 该算法主要解决最短路径问题,采⽤是贪⼼思想;
    • 对象:权重图;
    • 该算法核⼼思想是,
      • 每次从路径最短的点出发遍历相邻边,检测修改路径值(确保相邻点也是最短),
      • 从未被确认路径最短的顶点集合中选择最短路径的点,
      • 将该点加⼊确认路径最短的顶点集合,并将该点作为下次遍历相邻边的出发点;
      • 结束后,图中从A出发到达任何一个点的最短路径都已知了,通过parent(谁修改它路径值的父节点),即可知道最短路径
        • 比如A -》E的最短路径是A -》C -》E;而E的parent为C,C的parent为A
    • 核⼼步骤:更新,扫描,修改;

3.常用使用形式

  • 应用场景

    • ⽹络爬⾍;
    • 地图应⽤:⾼德地图,百度地图(最短路径推荐,最短时⻓推荐);
    • 社交⽹络分析:好友推荐,垃圾⽤户分析,社交关系分析;
    • 推荐、精准营销;
    • 舆情控制,信息传播;
    • 防欺诈(⽹络诈骗和电信诈骗);
    • 计算⽣物学:模拟分⼦运动;

4.动态规划

标签:遍历,出度,路径,最短,集合,顶点,数据结构
From: https://www.cnblogs.com/zqurgy/p/17231881.html

相关文章

  • [LeetCode] 数据结构入门
    数据结构入门217存在重复元素给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。解法1:两层循环第一层循......
  • Django笔记二之连接数据库、执行migrate数据结构更改操作
    本篇笔记目录索引如下:Django连接mysql,执行数据库表结构迁移步骤介绍操作数据库,对数据进行简单操作接下来几篇笔记都会介绍和数据库相关,包括数据库的连接、操作(包括增......
  • 数据结构-绪论
    -本文参考于2024年的王道考研计算机的复习指导。-仅供学习交流,如侵权,即删。-本系列地址:https://www.cnblogs.com/kohler21/category/2289027.html目录第一章绪论数......
  • 数据结构
    数据结构你有一个长度为n的字符串,其中仅含0,1,2三个字符。你希望知道,这个字符串有多少个子串,满足该子串的0,1,2个数相等?n之和不超过3e5输入4301260011221810......
  • 数据结构-布隆过滤器
    1.布隆过滤器的概念定义布隆过滤器:是⼀种概率型数据结构,特点是⾼效的插⼊和查询,能明确告知某个字符串⼀定不存在或者可能存在;优点和缺点优点:布隆过滤器相⽐传......
  • golang常用库包:缓存redis操作库go-redis使用(03)-高级数据结构和其它特性
    Redis高级数据结构操作和其它特性第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及go-redis连接到Redishttps://www.cnblogs.com/jiujuan/p/17207166.html第......
  • 数据结构-->链表_02
    本期的链表继续进行,上期我们完成了链表的增加和删除。现在接下来,我们进行链表的查改与优化头文件“SList.h”#include<stdio.h>#include<assert.h>#include<stdlib.h>typ......
  • 数据结构(第一章)
    数据结构(第一章)一、概论数据:数据是信息的载体,是描述事物客观属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据元素:数据元素是数据......
  • 数据结构大乱炖
    线段树基本思想将[1,n]分解成若干特定的子区间(数量不超过4×n),然后,将每个区间[l,r]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[l,......
  • 数据结构-->链表_01
    首次书写链表有关的知识,先来明确什么是链表?链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的举一个形象化的现实生活中......