当前位置:首页 » 编程语言 » python邻接表

python邻接表

发布时间: 2023-04-17 23:04:50

1. 用python实现邻接矩阵转换为邻接表,python语言实现

  • graph = {'A': ['B', 'C'],

  • 'B': ['C', 'D'],

  • 'C': ['D'],

  • 'D': ['C','G','H'],

  • 'E': ['F'],

  • 'F': ['C']}

  • #从图中找出任意一条从起始顶点到终止顶点的路径

  • def find_path(graph, start, end, path=[]):

  • if start == end:

  • print "path", path

  • return True

  • if not graph.get(start):

  • path.pop()

  • return False

  • for v in graph[start]:

  • if v not in path:

  • path.append(v)

  • if find_path(graph,v,end,path):

  • return True

  • return False

  • path = []

  • if find_path(graph, 'A', 'C', path=path):

  • print(path)

  • else:

  • print(1)

  • #从图中找出从起始顶点到终止顶点的所有路径

  • import

  • def find_path_all(curr, end, path):

  • '''

  • :param curr: 当前顶点

  • :param end: 要到达的顶点

  • :param path: 当前袜搭段顶点的一条父路径

  • :return:

  • '''

  • if curr == end:

  • path_tmp = .deep(path)

  • path_all.append(path_tmp)

  • return

  • if not graph.get(curr):

  • return

  • for v in graph[curr]:

  • #一个顶点在当前递归路径中只能出现一次,否则会陷入死循环。

  • if v in path:

  • print("v %s in path %s" %(v, path))

  • continue

  • #构造下次递归的父路径

  • path.append(v)

  • find_path_all(v,end,path)

  • path.pop()

  • path_all = []

  • find_path_all('A', 'G',path=['A'])

  • print path_all

  • #遍历图中所有顶点,按照遍历枝举顺序将顶告誉点添加到列表中

  • vertex = []

  • def dfs(v):

  • if v not in graph:

  • return

  • for vv in graph[v]:

  • if vv not in vertex:

  • vertex.append(vv)

  • dfs(vv)

  • for v in graph:

  • if v not in vertex:

  • vertex.append(v)

  • dfs(v)

  • print(vertex)

2. MapRece之金庸的江湖人物分析项目

通过一个综合数据分析案例:”金庸的江湖——金庸武侠小说中的人物关系挖掘“,来学习和掌握MapRece程序设计。通过本项目的学习,可以体会如何使用MapRece完成一个综合性的数据挖掘任务,包括全流程的数据预处理、数据分析、数据后处理等。
1 任务1 数据预处理
1.1 任务描述
从原始的金庸小说文本中,抽取出与人物互动相关的数据,而屏蔽掉与人物关系无关的文本内容,为后面的基于人物共现的分析做准备。

1.2 关键问题
1.2.1 中文分词和人名提取
使用开源的Ansj_seg进行分词。Ansj_seg不仅支持中文分词,还允许用户自定义词典,在分词前,将人名列表到添加用户自定义的词典,可以精确识别金庸武侠小说中的人名。
但实际测试的时候发现,Ansj_seg分词会出现严重的歧义问题,比如“汉子”属于人名列表中的人名(nr),但Ansj_seg可能会错误地将它分类为名词(n)。因此,如果根据词性提取人名,会导致最后提取的人名太少。解决方法是在提取人名的时候,需要在将人名加入用户自定义词典的同时,构造一个包含所有人名的字典,对分词的结果逐个进行测试,如果在字典里,就是人名。
1.2.2 文件传输
使用HDFS传递数据。考虑到人名列表文件已经存放在了HDFS里,所以使用HDFS的方式不需要移动人名列表文件,只需要在Configuration中设置文件在HDFS文件系统中的路径,然后在Mapper的setup()函数里调用HDFS的函数获取文件内容即可。
1.2.3 单词同现算法
两个单词近邻关系的定义:实验要求中已经说明,同现关系为一个段落。
段落划分:非常庆幸的是,小说原文中一个段落就是一行,因此,不需要自己定义FileInputFormat和RecordReader。
1.3 MapRece设计
1.3.1 Mapper

1.3.2 Recer

1.3.3 Driver

2 任务2 特征抽取:人物同现统计
2.1 任务描述
完成基于单词同现算法的人物同现统计。在人物同现分析中,如果两个人在原文的同一段落中困嫌出现,则认为两个人发生了一次同现关系。我们需要对人物之间的同现关系次数进行统计,同现关系次数越多,则说明两人的关系越密切。

2.2 关键问题
2.2.1 人名冗余
在同一段中,人名可能多次出现,任务一只负责提取出所有的人名,没有剔除多余的人名,任务必须在输出同现次数之前汪简手处理冗余人名。我的做法是在Mapper中创建一个集合,把所有人名放入集合中,集合会自动剔除冗余的人名。
2.2.2 同现次数统计
两个人物之间应该输出两个键值对,如“狄云”和“戚芳”,应该输出“<狄云,戚芳> 1”和“<戚芳,狄云> 1”。多个段落中允许输出相同的键值对,因此,Recer中需要整合具有相同键的输出,输出总的同现次数。
2.3 MapRece设计
2.3.1 Mapper

2.3.2 Recer

3 任务3 特征处理:人物关系图构建与特征归一化
3.1 任务描述
根据任务2人物之间的共现关系,生成人物之间的关系图。人物关系使用邻接表的形式表示,人物是顶点,人物之间关系是边,两个人的关系的密切程度由共现次数体现,共现次数越高,边权重越高。另外需要对共现次数进行归一化处理,确保某个顶点的出边权重和为1。

3.2 关键问题
3.2.1 确保人物的咐携所有邻居输出到相同结点处理
在Mapper结点将输入的键值对“<狄云,戚芳> 1”拆分,输出新的键值对“<狄云> 戚芳:1”,“狄云”的所有邻居会被分配给同一个Recer结点处理。
3.2.2 归一化
在Recer结点首先统计该人物与所有邻居同现的次数和sum,每个邻居的的同现次数除以sum就得到共现概率。为了提高效率,在第一次遍历邻居的时候,可以把名字和共现次数保存在链表里,避免重复处理字符串。
3.3 MapRece设计
3.3.1 Mapper

3.3.2 Recer

4.1 任务描述
经过数据预处理并获得任务的关系图之后,就可以对人物关系图作数据分析,其中一个典型的分析任务是:PageRank 值计算。通过计算 PageRank,我们就可以定量地获知金庸武侠江湖中的“主角”们是哪些。
4.2 PageRank原理
PageRank算法由Google的两位创始人佩奇和布林在研究网页排序问题时提出,其核心思想是:如果一个网页被很多其它网页链接到,说明这个网页很重要,它的PageRank值也会相应较高;如果一个PageRank值很高的网页链接到另外某个网页,那么那个网页的PageRank值也会相应地提高。
相应地,PageRank算法应用到人物关系图上可以这么理解:如果一个人物与多个人物存在关系连接,说明这个人物是重要的,其PageRank值响应也会较高;如果一个PageRank值很高的人物与另外一个人物之间有关系连接,那么那个人物的PageRank值也会相应地提高。一个人物的PageRank值越高,他就越可能是小说中的主角。
PageRank有两个比较常用的模型:简单模型和随机浏览模型。由于本次设计考虑的是人物关系而不是网页跳转,因此简单模型比较合适。简单模型的计算公式如下,其中Bi为所有连接到人物i的集合,Lj为认为人物j对外连接边的总数:

在本次设计的任务3中,已经对每个人物的边权值进行归一化处理,边的权值可以看做是对应连接的人物占总边数的比例。设表示人物i在人物j所有边中所占的权重,则PageRank计算公式可以改写为:

4.3.2 PageRanklter类
GraphBuilder将数据处理成可供迭代的格式,PageRank的迭代过程由PageRanklter类实现,包含一个Map和Rece过程。Map过程产生两种类型的<key,value>:<人物名,PageRrank值>,<人物名,关系链表>。第一个人物名是关系链表中的各个链出人物名,其PR值由计算得到;第二个人物名是本身人物名,目的是为了保存该人物的链出关系,以保证完成迭代过程。以上面的输出为例,则Map过程产生的键值对为<完颜萍, 1.0 0.005037>,<小龙女, 1.0 0.017632>,……,<一灯大师, #完颜萍:0.005037783;……>。
Rece过程将同一人物名的<key,value>汇聚在一起,如果value是PR值,则累加到sum变量;如果value是关系链表则保存为List。遍历完迭代器里所有的元素后输出键值对<人物名,sum#List>,这样就完成了一次迭代过程。
PR值排名不变的比例随迭代次数变化的关系图如下,由于我们考虑的是找出小说中的主角,所以只要关心PR值前100名的人物的排名的变化情况,可以看到迭代次数在10以后,PR值排名不变的比例已经趋于稳定了,所以基于效率考虑,选取10作为PR的迭代次数。
4.3.3 PageRankViewer类
当所有迭代都完成后,我们就可以对所有人物的PageRank值进行排序,该过程由PageRankViewer类完成,包含一个Map和Rece过程。Map过程只提取迭代过程输出结果中的人物名以及对应的PageRank值,并以PageRank值作为key,人物名作为value输出。为了实现PageRank值从大到小排序,需要实现DescFloatComparator类来重写compare方法以达成逆序排序。由于可能存在PageRank值相同的情况,所以还需要一个rece过程来把因PageRank值相同而汇聚到一起的人物名拆开并输出。

PageRankMapper

PageRankRecer

Driver类

5.1 任务描述
标签传播(Label Propagation)是一种半监督的图分析算法,他能为图上的顶点打标签,进行图顶点的聚类分析,从而在一张类似社交网络图中完成社区发现。在人物关系图中,通过标签传播算法可以将关联度比较大的人物分到同一标签,可以直观地分析人物间的关系。
5.2 标签传播算法原理
标签传播算法(Label Propagation Algorithm,后面简称LPA)是由Zhu等人于2002年提出,它是一种基于图的半监督学习方法,其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。LPA基本过程为:(1)每个结点初始化一个特定的标签值;(2)逐轮更新所有节点的标签,直到所有节点的标签不再发生变化为止。对于每一轮刷新,节点标签的刷新规则如下:对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋值给当前节点。当个数最多的标签不唯一时,随机选择一个标签赋值给当前节点。
LPA与PageRank算法相似,同样需要通过迭代过程来完成。在标签传播算法中,节点的标签更新通常有同步更新和异步更新两种方法。同步更新是指,节点x在t时刻的更新是基于邻接节点在t-1时刻的标签。异步更新是指,节点x在t时刻更新时,其部分邻接节点是t时刻更新的标签,还有部分的邻接节点是t-1时刻更新的标签。若LPA算法在标签传播过程中采用的是同步更新,则在二分结构网络中,容易出现标签震荡的现象。在本次设计中,我们考虑到了两种更新方法,并进行了比较。
5.3 标签传播算法在maprece上的实现细节
5.3.1 LPAInit类
为实现LPA的迭代过程,需要先给每个人物赋予一个独特标签,标签初始化由LPAInit类完成,仅包含一个Map过程。标签由数字表示,Map过程由1开始,为每一个人物名赋予一个独特的标签。为了便于后面的可视化分析,我们需要把PageRank值和标签整合在一起,所以LPAInit的输入文件直接采用PageRank过程的输出文件,格式如下:

5.3.2 LPAIteration类
LPAIteration类完成标签的更新过程,其格式与LPAInit的输出格式一致,包含一个Map和Rece过程。Map过程对输入的每一行进行切割,输出四种格式的<key,value>:<人物名,关系链表>,<人物名,PageRank值>,<人物名,标签>,<链出人物名,标签#起点人物名>。第四种格式个键值对是为了将该节点的标签传给其所有邻居。
Rece过程对value值进行识别,识别可以通过Map过程把预先定义好的特殊字符如‘#’、‘@’来实现前缀到value上来实现。由于人物关系图中的各个边都是有权重的,并且代表两个人物的相关程度,所以标签更新过程不是用边数最多的标签而是权重最大标签来更新,我们可以预先把权重最大的若干个保存到一个链表中,如果存在多个权重相同的标签,则随机选取一个作为该人名新的标签。异步方法更新标签需要使用一个哈希表来存储已经更新标签的人物名和它们的新标签,并且在更新标签时使用该哈希表里面的标签。同步方法更新标签则不需要存储已更新的标签。
本次设计中比较了同步和异步更新两种方法,下图为标签不变的比例随迭代次数的变化。可以发现,异步收敛速度更快,只要6次迭代即可完全收敛,且标签不变的比例可达100%。而同步更新方法则不能达到100%,说明人物关系图中存在子图是二部子图。
5.3.3 LPAReorganize类
LPA算法迭代收敛后,所有人物名的标签不再变化,但是此时的标签排列是散乱的,需要把同一标签的人物名整合在一起。该过程由LPAReorganize类完成,包含一个Map和Rece过程。Map过程对输入的每一行进行切割,以<标签,人物名#PageRank值#关系链表>格式输出。Rece过程中,同一标签的人物名汇聚在一起,然后根据每个标签人物集合的大小从大到小排序,重新赋予标签(从1开始)。这样输出文件中同一标签的人物名就会聚集在一起。最后的输出格式如下:

5.3.2 LPAMapper类
LPAIteration类完成标签的更新过程,其格式与LPAInit的输出格式一致,包含一个Map和Rece过程。Map过程对输入的每一行进行切割,输出四种格式的<key,value>:<人物名,关系链表>,<人物名,PageRank值>,<人物名,标签>,<链出人物名,标签#起点人物名>。第四种格式个键值对是为了将该节点的标签传给其所有邻居。

5.3.2 LPARecer类
Rece过程对value值进行识别,识别可以通过Map过程把预先定义好的特殊字符如‘#’、‘@’来实现前缀到value上来实现。由于人物关系图中的各个边都是有权重的,并且代表两个人物的相关程度,所以标签更新过程不是用边数最多的标签而是权重最大标签来更新,我们可以预先把权重最大的若干个保存到一个链表中,如果存在多个权重相同的标签,则随机选取一个作为该人名新的标签。异步方法更新标签需要使用一个哈希表来存储已经更新标签的人物名和它们的新标签,并且在更新标签时使用该哈希表里面的标签。同步方法更新标签则不需要存储已更新的标签。

Driver类

6.1 可视化工具Gephi
Gephi是一款开源的跨平台的基于JVM的复杂网络分析软件。把PageRank和LPA的结果,转化为gexf格式,在Gephi中绘制图像并分析大数据实验结果,更加直观、易于理解。
gexf实际上是一种特殊的XML文件,python的gexf库提供了接口方便我们编辑和生成gexf文件,因此我们选择使用python处理PageRank和LPA的结果。顶点有两种属性,LPA生成的标签和PageRank计算的PR值,每条边的权重是PageRank计算出的值。在可视化的时候,标签决定顶点显示的颜色,PR值决定标签的
6.2 可视化预处理
编写一个python程序transform2xml.py,将数据分析部分得到的PR值,标签以及点连接关系处理成一个可供Gephi读取的gexf文件。
6.3 可视化结果

7 输出结果截图

7.2 同现次数统计

7.4 PageRank

3. 邻接表 判断有向图是否有环 python

邻接表还是逆邻接表看如果是逆邻接表,每个顶点出发邻接表的链表中的结点个数就是入度
如果是邻接表过程如下:
有一个辅助数组,大小就是顶点数量,所有元素初值都为0
从头到尾遍历每个顶点出发的邻接表的结点,只要当前结点的数据是几(也就是第几个结点被有向弧进入了),这个下标的辅助数组元素加1,等所有的邻接表的小链表遍历完了,这个辅助数组中各个下标的数字就是该顶点的入度

4. python版解:用p指针扫描结点,根据p. data值将该结点插入到3个单链表L、L1和L2

P=L 把L指向地址百付给PP和L同时执行同内存地址

p=p->next p移了L链下地址指向了L下元素地址

L->next=NULL L值只空指针地址

00

建立二叉搜索树并查找父结点

求单链表的长度度

指针数组的每个元素都是一个指针变量

静态链表和动态链表的区别

数据结构问创建单链表

邻接表存储图的广度优先遍历

带头指针L的双向循答环链表中,指针p指向双向循环链表的尾版结点...

这样应该有这样的关系: 尾结点->头结点。又因为链表是双向的,所以头结点应该有指向尾结点的指针,即:尾结点<-头结点。如果P指向尾结点,则有权P->next == L,而L->p...

5. python graph怎么看

图结构(Graph)——算法学中最强大的框架之一。树结构只是图的一种特殊情况。

如果我们可将自己的工作诠释成一个图问题的话,那么该问题至少已经碰判接近解决方案了。而我们我们的问题实例可以用树结构(tree)来诠释,那么我们基本上已经拥有了一个真正有效的解决方案了。

邻接表及加权邻接字典

对于图结构的实现来说,最直观的方式之一就是使用邻接列表。基本上就是针对每个节点设置一个邻接列表。下面我们来实现一个最简单的:假设我们现有 n 个节点,编号分别为 0, …, n-1.

节点当然可以是任何对象,可被赋予任何标签或名称。但使用 0, …, n-1 区间内的整数来实现的话,会简单许多。因为如果我们能用数字来代表节点,我们索引起来显然要方便许多。

然后,每个邻接(邻居)列表都只是一个数字列表,我们可以将它们编入一个大小为 n 的主列表,并用节点编号对其进行索引。由于这些列表内的节点的顺序是任意的,所以,实际上,我们是使用列表来实现邻接集(adjacency sets)。这里之所以还是使用列表这个术语,主要是因为传统。幸运的是,Python 本身就提供独立的 set 类型。

我们以下图为例,说明图结构的各种表示方笑凳改法(当我们在执行与图相关的工作时,粗孝需要反复遵从一个主题思想,即一个图的最佳表示方法应该取决于我们要用它来做什么):



a, b, c, d, e, f, g, h = range(8)N = [ {b, c, d, e, f}, {c, e}, {d}, {e}, {f}, {c, g, h}, {f, h}, {f, g}]1234567891011

在图论中,N(v)代表的是v的邻居节点集;

>>> b in N[a] # neighborhood membershipTrue>>> len(N[f]) # out-degree:出度31234

加权邻接字典

使用dict类型来代替set或list来表示邻接集。在 dict 类型中,每个邻居节点都会有一个键和一个额外的值,用于表示与其邻居节点(或出边)之间的关联性,如边的权重。

a, b, c, d, e, f, g, h = range(8)
N = [

{b:2, c:1, d:3, e:9, f:4},
{c:4, e:4},
{d:8},
{e:7},
{f:5},
{c:2, g:2, h:2},
{f:1, h:6},
{f:9, g:8}
]123456789101112

客户端调用:

>>> b in N[a] # neighborhood membership
True
>>> len(N[f]) # out-degree
3
>>> N[a][b] # Edge weight for (a, b)
2123456

邻接矩阵

邻接矩阵是图的另一种表示方法,这种表示方法的主要不同在于,它不再列出每个节点的所有邻居节点。

a, b, c, d, e, f, g, h = range(8)

N =[
[0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 1, 0],
]12345678910111213

关于邻接矩阵:

  • (1)主对角线为自己到自己,为0

  • (2)行和为出度

  • (3)列和为入度

6. 计算机专业都学什么呢

计算机专业类包括计算机科学与技术、软件工程、网络工程、信息安全等七八个专业。
计算机专业学习的课程主要有大数据技术导论、数据采集与处理实践(Python)、Web前/后端开发、统计与数据分析、机器学习、高级数据库系统、数据可视化、云计算技术、人工智能、自然语言处理、
媒体大数据案例分析、网络空间安全、计算机网络、数据结构、软件工程、操作系统等,以及大数据方向系列实验,并完成程序设计帆棚、数据分析、机器学习、数据可视隐轿芹化、灶毕大数据综合应用实践、专业实训和毕业设计等多种实践环节。

7. arcgis利用 python设置高程颜色

1、四色填充算法—回溯法。
2、ArcGIS生成邻接表。
3、基于Python编写工具计算每个省份的颜色。
4、在ArcGIS中添加脚本工具。
5、运行脚本工具。
6、以上就是arcgis利用python设置高程颜色的方法。

8. 非递归算法,以孩子兄弟为存储结构的计算树的深度 这个程序什么意思 该怎么理解

首先树的儿子会有很多的,为了解决儿子很多且不定的情况:
也采用二叉树的存储结构类型,但做了一点改进:
左节点vp表示大儿子,右节点hp表示兄弟,这样“树”就变成“二叉树”
的结构了。 右节点串在一起,表示同一层。
另要搞懂队列,是数组做的循环队列qu[ ], 头front ,尾rear;
又增加一个数组 level [ ]是队列qu[ ]的辅助单元, 存放 队列节点的层号,两数组
下标是一一对应的;
这两个概念是基础,一定要懂。不懂是看不下去的。
算法的核心:
1. 用队列的方法遍历所有节点,从队列中取出一个节点指针进行访问,同时
取出层号,并把这个节点的所有子节点及它的层号放入队列镇芹,以便以后取出访问;
为了启动遍历,初始队列须压入根节点;
2. 遍历时知道这个节点层号(m),御衫毕就可比较,最大值(max)就是树的深度。
3. 遍历访问一个节点时,左节点vp就是大儿子,属下一层,层号是m+!,
右节点开始就是同层兄弟(第二个while就是),须压入队列,层号仍是m+1;
4. 反复循环取出队列中节点进行访问(直到为空),并把它的把有儿子塌友压入队列
以便再次访问;

这个经典算法,不复杂, 有不明白的再追问

9. 用python实现邻接矩阵转换为邻接表,python语言实现

graph
=
{'A':
['B',
'C'],
'B':
['C',
'D'],
'C':
['D'],
'D':
['C','G','H'],
'E':
['F'],
'F':
['C']}
#从图中找出任意一条从起始顶点到终止顶点的路径
def
find_path(graph,
start,
end,
path=[]):
if
start
==
end:
print
"path",
path
return
True
if
not
graph.get(start):
path.pop()
return
False
for
v
in
graph[start]:
if
v
not
in
path:
path.append(v)
if
find_path(graph,v,end,path):
return
True
return
False
path
=
[]
if
find_path(graph,
'A',
'C',
path=path):
print(path)
else:
print(1)
#从图中找出从起始顶点到终止顶点的所有路径
import

def
find_path_all(curr,
end,
path):
'''
:param
curr:
当前顶点
:param
end:
要到达的顶点
:param
path:
当前顶点的一条父路径
:return:
'''
if
curr
==
end:
path_tmp
=
.deep(path)
path_all.append(path_tmp)
return
if
not
graph.get(curr):
return
for
v
in
graph[curr]:
#一个顶点在当前递归凯旦肆路径中只能出现一次,否则会陷入死循环。
if
v
in
path:
print("v
%s
in
path
%s"
%(v,
path))
continue
#构造迟神下次递归的父路径
path.append(v)
find_path_all(v,end,path)
path.pop()
path_all
=
[]
find_path_all('A',
'G',path=['A'])
print
path_all
#遍历图中所有顶点,按照遍历顺序将顶点添加盯轿到列表中
vertex
=
[]
def
dfs(v):
if
v
not
in
graph:
return
for
vv
in
graph[v]:
if
vv
not
in
vertex:
vertex.append(vv)
dfs(vv)
for
v
in
graph:
if
v
not
in
vertex:
vertex.append(v)
dfs(v)
print(vertex)

10. 简介图论算法

图论101

图论是数学的一个非常广泛哪誉的分支,非常适用于现实世界中的问题。 最初,图论是"发明"来解决现实问题的,此后,它像所有其他数学分支一样,被抽象数学家所劫持。

在本教程和后续教程中,我们将介绍一些图论算法及其在Python中的实现。 现在,回到主题。

简而言之,图是一组顶点/节点和边。 如果您对" set"不满意,请用collection代替。

在上图中,顶点/节点将是人物。

顶点是图的基本单位。 它几乎可以代表任何实体,通常以圆圈表示。

在上图中,连接袭缓陪人的线是边。

顶点之间的线或连接称为边。 它可以表示顶点之间的任何类型的关系。

边上具有方向的图称为有向图。 它可以用来显示与前辈(从父母到孩子的箭头)或祖先(从孩子到父母的箭头)的关系。

边上没有方向的边的图称为无向图。 它可用于显示双向道路。

边上带有数字的图形,代表交易成本,旅途公平,城市之间的距离等。它可以具有任何类型的边。

没有循环的无向图是一棵树。 在这里,循环意味着只有一种方法可以通过跟随给定其他节点的边缘来到达节点。

一棵树的所有节点都通过一条边连接到其他某个节点,并且有N个节点的N-1个边。

表示图形的方法有很多,最常见的两种是:

假设图中有N个节点。 我们可以使用具有N行和N列的矩阵来表示它,其中该矩阵的行和列将代表一个节点,并且其中的条目代表有向边(有或没有权重)。

它们形成代表行的节点到代表列的节点。 通常,0或无穷大用于表示节点之间没有边缘。 在Python中,邻接矩阵可以表示为:

类似地,对于拍蠢N个节点的图,我们可以使用邻接表来表示该图,其中节点的所有边都保留在元组列表(节点,权重)中。 在python中,它可以表示为:

我使用嵌套字典(这就是我所说的)和带集合的字典(如果节点没有权重的边)来表示图。

在下一篇文章中,我将使用不同的方法发布精心设计的图类的Python代码,我们将使用该代码来实现图算法。

(本文翻译自sleepingFish的文章《Graph Theory Algorithms "Simplified"》,参考:https://medium.com/better-programming/graph-theory-algorithms-simplified-9a6868cc222)

热点内容
java数组包含字符串 发布:2024-11-01 22:31:15 浏览:791
服务器和家用电脑质量 发布:2024-11-01 22:28:29 浏览:488
sqlserver默认实例 发布:2024-11-01 22:23:42 浏览:959
sort排序java 发布:2024-11-01 22:23:26 浏览:47
解压后的apk无法安装 发布:2024-11-01 22:22:10 浏览:665
公司的pop服务器地址 发布:2024-11-01 22:22:07 浏览:119
朵唯m30手机配置是真的吗如何 发布:2024-11-01 22:16:56 浏览:681
梦幻西游怎么清理缓存 发布:2024-11-01 22:15:52 浏览:344
如何配置fcm 发布:2024-11-01 22:08:15 浏览:854
原装电脑配置哪个好 发布:2024-11-01 22:05:49 浏览:729