首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

规范化邻接列表

基础概念

规范化邻接列表(Normalized Adjacency List)是一种用于表示图数据结构的方法。在这种表示法中,每个节点都有一个与之关联的列表,该列表包含了所有与该节点直接相连的其他节点以及相应的边权重(如果有的话)。规范化邻接列表通常用于图的存储和遍历操作。

相关优势

  1. 空间效率:相比于邻接矩阵,规范化邻接列表在存储稀疏图时更加节省空间,因为它只存储实际存在的边。
  2. 灵活性:易于添加、删除节点和边,因为只需要更新相关的列表即可。
  3. 遍历效率:对于某些图算法(如深度优先搜索、广度优先搜索),规范化邻接列表提供了更高效的遍历方式。

类型

规范化邻接列表通常有两种形式:

  1. 无向图的规范化邻接列表:每个节点的邻接列表包含与其相连的所有节点,且边是双向的。
  2. 有向图的规范化邻接列表:每个节点的邻接列表包含指向它的所有节点(入边)和它指向的所有节点(出边)。

应用场景

规范化邻接列表广泛应用于各种需要表示图结构的场景,如社交网络分析、路由算法、推荐系统等。

遇到的问题及解决方法

问题:如何构建规范化邻接列表?

解决方法

对于无向图,可以按照以下步骤构建规范化邻接列表:

  1. 初始化一个空的字典(或其他适当的数据结构)来存储节点及其邻接列表。
  2. 遍历图中的每一条边,将边的两个端点添加到对方的邻接列表中。

示例代码(Python):

代码语言:txt
复制
def build_normalized_adjacency_list(edges):
    adjacency_list = {}
    for u, v in edges:
        if u not in adjacency_list:
            adjacency_list[u] = []
        if v not in adjacency_list:
            adjacency_list[v] = []
        adjacency_list[u].append(v)
        adjacency_list[v].append(u)
    return adjacency_list

# 示例边集合
edges = [(1, 2), (2, 3), (3, 4), (4, 1)]
adj_list = build_normalized_adjacency_list(edges)
print(adj_list)

输出:

代码语言:txt
复制
{1: [2, 4], 2: [1, 3], 3: [2, 4], 4: [3, 1]}

对于有向图,只需稍作修改,将边的方向考虑在内:

代码语言:txt
复制
def build_normalized_adjacency_list_directed(edges):
    adjacency_list = {}
    for u, v in edges:
        if u not in adjacency_list:
            adjacency_list[u] = {'out': [], 'in': []}
        if v not in adjacency_list:
            adjacency_list[v] = {'out': [], 'in': []}
        adjacency_list[u]['out'].append(v)
        adjacency_list[v]['in'].append(u)
    return adjacency_list

# 示例边集合
edges = [(1, 2), (2, 3), (3, 4), (4, 1)]
adj_list_directed = build_normalized_adjacency_list_directed(edges)
print(adj_list_directed)

输出:

代码语言:txt
复制
{1: {'out': [2], 'in': [4]}, 2: {'out': [3], 'in': [1]}, 3: {'out': [4], 'in': [2]}, 4: {'out': [1], 'in': [3]}}

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 邻接表与邻接矩阵

    邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。对于图 而言,其中 表示顶点集合, 表示边集合。...邻接表无向图 graph 表示?有向图 digraph 表示?若采用邻接表表示,则需要申请|V|个列表,每个列表存储一个顶点出发的所有相邻顶点。...如果图G 为有向图,则|V| 个列表存储的总顶点个数为|E|;如果图G为无向图,则|V| 个列表存储的总顶点个数为2|E|(暂不考虑自回路)。...若采用邻接矩阵表示,则需要申请空间大小为 的二维数组,在二位数组中保存每两个顶点之间的连通关系,则无论有向图或无向图,邻接矩阵方式的存储空间复杂度皆为 。...两种存储结构对比根据邻接表和邻接矩阵的结构特性可知,当图为稀疏图、顶点较多,即图结构比较大时,更适宜选择邻接表作为存储结构。

    1.9K00

    邻接

    邻接矩阵缺点: 邻接矩阵是不错的存储结构,但是我们发现,对于边数相对于顶点较少的图,这种结构是存在对存储空间的极大浪费的 因此在处理稀疏图时,可以采用下面将要介绍的邻接表 ? ? 无向图的邻接表 ?...有向图的邻接表 ? ? ? 网图的邻接表 ? 邻接表存储有向图的类 ? 有向图邻接表的构造函数初始化操作 ? ? ? 邻接表的构造函数和输出函数代码实现 ?...因为邻接表来查询某个顶点的入度非常繁琐,因此为了解决查找入度麻烦的问题,引出了逆邻接表 ?...firstin---->指向入边节点—>指向边链表中当前当前顶点作为入度节点的节点----->相当于逆邻接链表 firstout—>指向出边节点----->指向边链表中当前节点作为初度节点的节点—>相当于邻接链表...邻接矩阵和邻接表性能比较 ?

    61810

    数据结构(八):邻接表与邻接矩阵

    邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。 对于图 而言,其中 表示顶点集合, 表示边集合。...有向图 digraph 表示 digraph_adjacency_list 若采用邻接表表示,则需要申请 个列表,每个列表存储一个顶点出发的所有相邻顶点。...如果图 为有向图,则 个列表存储的总顶点个数为 ;如果图 为无向图,则 个列表存储的总顶点个数为 (暂不考虑自回路)。即邻接表方式的存储空间复杂度为 。...邻接矩阵 无向图 graph 表示 graph_adjacency_matrix 有向图 digraph 表示 digraph_adjacency_matrix 若采用邻接矩阵表示,则需要申请空间大小为...两种存储结构对比 根据邻接表和邻接矩阵的结构特性可知,当图为稀疏图、顶点较多,即图结构比较大时,更适宜选择邻接表作为存储结构。

    1.5K30

    邻接矩阵学习

    邻接矩阵:是表示顶点之间相邻关系的矩阵。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间的关系(边或弧)的数据,这个二维数组称为邻接矩阵。...邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。 设G=(V,E)是一个图,其中V={v1,v2,.....,vn}。...特点: 无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。...用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。 所谓邻接矩阵(Adjacency Matrix)的存储结构,就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。...用邻接矩阵表示法表示图如图8.7 所示。 用邻接矩阵表示法表示网图如图8.8 所示。 ?

    1.5K10

    邻接表详解(CC++)

    》 一、概念 邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点。...二、分类  1)无向图的邻接表 例如,一个无向图及其邻接表如下图所示。...一个节点的所有邻接点构成一个单链表 解释: • 节点a 的邻接点是节点b 、d ,其邻接点的存储下标为1、3,按照头插法(逆序)将其放入节点a 后面的单链表中; • 节点b 的邻接点是节点a 、c 、...d ,其邻接点的存储下标为0、2、3,将其放入节点b 后面的单链表中; • 节点c 的邻接点是节点b、d ,其邻接点的存储下标为1、3,将其放入节点c 后面的单链表中; • 节点d 的邻接点是节点a、b...2)有向图的邻接表(出弧) 例如,一个有向图及其邻接表如下图所示。

    65620

    5.2.2 邻接表法

    当一个图为稀疏图时,使用邻接矩阵表示法显然要浪费大量的存储空间。而图的邻接表示法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。...顶点表结点由顶点域(data)和指向第一条邻接边的指针(firstarc)构成 边表(邻接表)结点由结点域(adjvex)和指向下一条邻接边的指针域(nextarc)构成。...③优点:在邻接表中,给定一顶点,能很容易地找出它的所有邻边,因为只需要读取它的邻接表就可以了。在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为O(n)。...④在有向图的邻接表表示中,求一个给定顶点的出度只需计算其邻接表中的结点个数即可;但求其顶点的入度,则需要遍历全部的邻接表。因此,也有人采用逆邻接表的存储方式来加速求解给定顶点的入度。...当然,这实际上与邻接表存储方式是类似的。 ⑤图的邻接表表示并不唯一,这是因为在每个顶点对应的单链表中,各边结点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。

    72330

    5.2.4 邻接多重表

    邻接多重表时无向表的另一种链式存储结构。 在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边,或需要对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。...与十字链表类似,在邻接多重表中,每一条边用一个结点表示,其结构如下图: mark ivex ilink jvex jlink info 其中,mark为标志域,可以用以标记该条表是否被搜索过;ivex...在邻接多重表中,所有依附于同一顶点的边串联在同一链表中,由于每条边依附于两个顶点,则每个边结点同时链接在两个链表中。...顶点信息 ArcNode *firstedge;//指向第一条依附该顶点的边 }VNode; typedef struct{ VNode adjmulist[MaxVertexNum];//邻接表...int vexnum ,arcnum;//图的顶点数和弧数 }AMLGraph;//AMLGraph 是以邻接表存储的图类型

    92010

    【图论-存图】邻接矩阵 邻接表 链式前向星

    这篇文章主要来讲一下邻接矩阵 邻接表 链式前向星(本篇需要具备一定图的基础知识,至少邻接矩阵之前要会,这里主要讲解邻接表和链式前向星) 我不大喜欢说废话,所以直接上图 邻接矩阵:用二维数组存储点与点之间的关系...,也就是这样 但是仔细想想,有很多不必要的空间浪费,比如说(2,5)这个空间就没有必要,那我们可以像一个办法来去掉这些多余的空间,邻接矩阵我们用的是二维数组,那这里我们想一下,根据每一个点到另一个点不同...没错,所以在一定程度上,我认为邻接表其实就是邻接矩阵把那些没必要的点给扣掉。...edge; //这里使用动态数组,使用普通数组也是可以的 vectore; vectorhead;//建议从1开始存,其值是指向一个e的下标 其实链式前向星,我个人觉得,可以简单理解为邻接表的降为...-1的,我们把-1赋值给e[0]的next;后面同理,如果又要插入一条边为1 4 3的话,那e[1]的话,存储的值就是:4 3 0(0是head[1]插入当前结点之前的值),这样我们就有把它像邻接表一样给连起来了

    56353

    图的遍历(下)——邻接

    概述 在我的上一篇博客:图的遍历(上)——邻接矩阵 中主要介绍了邻接矩阵的BFS和递归的DFS与非递归的DFS这3种遍历算法。在这篇博客我将主要叙述邻接表的以上3中遍历算法。...首先来看看邻接表的表示方法。 邻接表主要是针对稀疏图中邻接矩阵造成的空间浪费而提出的。下面我们来看看邻接表的表示。 1)无向图的表示 ? 2)有向图 ?...(说明:对于BFS,DFS的递归与非递归算法在这篇文章就不再重复,如有不了解请移步我的上一篇博客:图的遍历(上)——邻接矩阵 ) ---- 广度优先遍历(BFS) //广度优先遍历(BFS) void...vector node; //找到当前结点 EdgeList* cur = this->Find(vertex); while(cur){ //寻找当前结点的邻接点...int index = cur->getVertex(cur); this->isvisited[index] = 1; cout<<index<<" "; //一次堆当前结点的邻接点进行

    88910

    git commit规范化实践

    最近从svn转到git进行代码版本控制,今天了解了git commit规范化的一些知识后,写此文章记录下配置过程。...环境 编辑器使用的是vscode,项目框架是vue3.0 规范化工具 规范化git commit消息的工具commitizen # 将commitizen命令行安装到全局 npm install -g...commitizen对commit规范化界面都是英文提示,这个时候我就想如果要汉化怎么办,这就有了下面一个工具的出现。...版本发布 进行commit规范化的好处是为了提高团队协作效率,使代码阅读性更强。还有另外一个节省后期维护版本信息的成本。...通过规范化commit行为,我们可以通过自动化工具生成版本信息这样极大的降低了维护成本,提高了工作效率。

    1.3K20
    领券