存图利器——链式前向星

本文深入解析链式前向星数据结构,一种用于高效存储和查询图中边的算法。通过对比邻接矩阵和前向星,阐述链式前向星在大规模数据集上的优势。介绍了head和next数组的作用,以及如何实现链式前向星的DFS遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存图的各种数据结构,复杂如下

邻接矩阵    O(1)(查询一条边)      O(n)枚举出边    O(N*N)空间复杂度   

前向星  O(n)(查询一条边)      O(n)枚举出边    O(N)空间复杂度    (预处理时间复杂度(O(NlgN)))

链式前向星 O(n)(查询一条边)     O(n)枚举出边      O(N)空间复杂度

我们发现对于与一道题若n逼近10^6时,前两者的时间就不行了,而链式前向星还可以支撑这种数据规模

那么链式前向星究竟是什么呢?

 

对于和结点u有边连接的v,我们为其分配一个地址,

那么对于u,我们如何查到这个地址呢?

这个问题引入了链式前向星中的head数组和next数组,

head[u]表示与结点u有连边的第一个点的地址id

而next数组更像是一个指针,对于next[id]令其指向下一个和u有连边的地址

在这个地址上,我们只要存储和u相连的是哪个点v即可

代码如下:

procedure add(u,v:longint);//加入一条从u连向v的有向边
begin
  inc(tot);//分配地址
  next[tot]:=head[u]; head[u]:=tot; vet[tot]:=v;//链表的插入
end;

那么我们如何实现dfs呢

procedure dfs(id:longint);
var point:longint;
begin
  point:=head[id];
  while point<>0 do //一直找下一个地址
  begin
    dfs(vet[point]);//深搜
    point:=next[point];//跳到下一个地址
  end;
end;

链式前向星就讲到这里了

 

转载于:https://www.cnblogs.com/by-w/p/9816590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值