首页 > 其他分享 >存图的方法

存图的方法

时间:2023-03-19 18:11:30浏览次数:31  
标签:存储 遍历 idx int 邻接矩阵 存图 方法 节点

结构体

代码

struct
{
    int a,b,w; //a为起点,b为终点,w为边权
}edge[M];

优点:

  • 结构体可以灵活地定义每个节点的附加信息,例如权值、坐标等;
  • 可以方便地遍历所有的边或节点;

缺点:

  • 不利于图的迭代修改,因为很难动态地调整结构体中节点的顺序;
  • 遍历某些节点的出边或入边会相对困难

邻接表

代码

int e[N], ne[N], idx, h[N], w[N];
void add(int a,int b, int c)
{
    e[idx] = b,ne[idx] = h[a] , w[idx] = c, h[a] = idx++;
}

优点:

  • 占用空间较小,只需存储每个节点与其出边或入边的关系;
  • 方便存取和添加边。而且可以动态调整图的大小;
  • 适用于存储稀疏图,因为只需存储每个节点的相邻节点即可。

缺点:

  • 访问某个节点 \(i\) 的相邻节点比较耗时,在存在大量出度非常高的情况下,时间复杂度可能达到 \(O(E)\) , \(E\) 为边数;
  • 在计算稠密图中的某些算法时,跟邻接矩阵比较,速度慢。

邻接矩阵

代码

int g[N][N]; //g[a][b] = w 中 a 为起点 b 为终点 w 为边权

优点:

  • 快速访问节点 \(i\) 和 \(j\) 之间是否存在一条边,并可以快速获取两个节点之间的权重;
  • 在邻接矩阵中查找某个节点的相邻节点非常容易,\(O(1)\) 即可完成;
  • 适用于存储稠密图,因为可以快速访问任意两个节点之间的距离。

缺点:

  • 占用空间比较大,当图较稀疏时浪费空间;
  • 在计算稀疏图中的某些算法时,跟邻接表比较,速度慢。

综上所述,不同的存储方式适合不同的场景,如何选择要根据实际情况来判断。如果希望得到更快的遍历和存取性能,则应该使用邻接矩阵;如果希望节省空间,则应该使用邻接表;如果需要存储节点的附加信息或遍历所有边,则应该使用结构体。

标签:存储,遍历,idx,int,邻接矩阵,存图,方法,节点
From: https://www.cnblogs.com/juniexd/p/17233827.html

相关文章

  • Windows平台解压lz4格式文件的方法
    在GitHub上看到一个7-Zip的扩展项目,为7-Zip增加了一些格式和压缩算法的支持,也包括lz4的压缩/解压缩。还是熟悉的7z味道,可以当作是一个增强版的7z。https://github.com/mcm......
  • WshShell对象Run方法(VBA)
    WshShell对象Run方法(VBA)以下代码通过vbs脚本可实现运行CMD且隐藏黑窗口运行。(记事本保存为后缀名为.vbs的文件)Setws=CreateObject("Wscript.Shell")ws.run"cmd/c......
  • 修改的方法 docker 命令上传
    创建目录执行,keep下的文件,连接不到集群里面的,复制到操作我们的集群,没有启动Keepalive并不一定是服务器的节点,找到一个节点之后访问到集群,boostarp创建一下,创建完成后,版......
  • SQL server分页的三种方法
    一、EntityFramework的Linq语句的分页写法:vardatacount=test.OrderBy(t=>t.testID).Skip(pageSize*(pageIndex-1))......
  • golang  实现 sync.WaitGroup wait() 方法 超时 自动释放
    思路是把wg.wait()放到一个协程里,通过chan向外发送完成信号。外层通过一个select超时结构来控制最大超时时间。funcwaitTimeout(wg*sync.WaitGroup,timeouttime.Du......
  • Python中通过反射来调用方法
    Isthereawaytopassinvokefunctionbymethodnameinstring,whichmeanscallthemethodbyreflectionYes,youcanusereflectioninPythontoinvokeame......
  • implement方法, 结构体快速自动生成结构体方法代码, Alt+Shift+Enter, var _ someInte
    1golandwindows点击Alt+Shift+Entervar_someInterface=(*someStruct)(nil)packagemaintypesomeInterfaceinterface{ DoSomething() DoAnotherThing()}t......
  • 专用处理器:AI加速器的实现方法与应用
    上海大学2021~2022学年冬季学期    《研究方法与前沿》综述报告报告题目:AI加速器的实现方法与应用   任课教师:评阅日期: AI加速器的实现方法与应......
  • 方法重载
    重载就是在一个类中,有相同的函数名称,但形参不同的函数。规则:方法名称必须相同;参数列表必须不同,(个数,类型,排列顺序);方法的返回值类型可以相同,也可以不同;......
  • 优先队列(PriorityQueue)常用方法及简单案例
    1前言PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:插入......