Algorithm 生成无向图的最简单方法&x2019;什么是邻接列表?
我能找到的最接近的东西是: 但它不会随机生成图形。我想为1000+节点图生成一个邻接列表 例如{0,2,3},{1,5}Algorithm 生成无向图的最简单方法&x2019;什么是邻接列表?,algorithm,graph,Algorithm,Graph,我能找到的最接近的东西是: 但它不会随机生成图形。我想为1000+节点图生成一个邻接列表 例如{0,2,3},{1,5} 其中节点0具有边0、2、3 节点1具有边1,5 等等 任何帮助都将不胜感激。如果您想生成包含N节点和M边的随机图,最简单的方法是以下算法: 让list成为所有对的列表(0,1),…,(0,N-1),(1,2),…,(N-2,N-1):所有S=(N-1)*N/2可能的边。然后您需要生成此列表的一个随机子集,大小为M 从0到S-1 交换索引上的元素x0和S-1 从0到S-
- 其中节点0具有边0、2、3
- 节点1具有边1,5
- 等等
任何帮助都将不胜感激。如果您想生成包含
N
节点和M
边的随机图,最简单的方法是以下算法:
让list
成为所有对的列表(0,1)
,…,(0,N-1)
,(1,2)
,…,(N-2,N-1)
:所有S=(N-1)*N/2
可能的边。然后您需要生成此列表的一个随机子集,大小为M
- 从
到0
S-1
- 交换索引上的元素
和x0
S-1
- 从
到0
S-2
- 交换索引上的元素
和x1
S-2
- (重复此操作,直到生成
编号)M
列表中最后的
M
元素将形成边的随机子集。然后,您可以将它们添加到图形中,并根据需要创建邻接列表。如果要生成包含N
节点和M
边的随机图形,最简单的方法是以下算法:
让list
成为所有对的列表(0,1)
,…,(0,N-1)
,(1,2)
,…,(N-2,N-1)
:所有S=(N-1)*N/2
可能的边。然后您需要生成此列表的一个随机子集,大小为M
- 从
到0
S-1
- 交换索引上的元素
和x0
S-1
- 从
到0
S-2
- 交换索引上的元素
和x1
S-2
- (重复此操作,直到生成
编号)M
M
元素将形成边的随机子集。然后,您可以将它们添加到图形中,并根据需要创建邻接列表。有用于生成具有特定统计特性的随机图形的方法。您在评论中已经说过,分布对于您的用例来说并不重要,因此使用一个简单的模型,它以一定的概率包含每个潜在的边,与是否包含其他边无关。这种分布通常称为G(n,p)
,其中n
是节点数,p
是包含边的概率
从G(n,p)
生成图形的算法非常简单:
- 使用
节点和无边初始化图形n
- 对于每对(无序/有序)节点
,u
:v
- 生成[0,1]范围内的随机实数
- 如果此数字小于
,则将边缘p
添加到图形中u-v
n
空列表的列表,“添加边”步骤将v
添加到u
(如果图形应该是无向的,则u
添加到v
的列表)
下面是Python中的一个示例实现:
从随机导入随机
来自itertools进口产品、组合
def随机图(n,p,*,directed=False):
节点=范围(n)
adj_list=[[]表示节点中的i]
可能的_边=产品(节点,重复=2),如果指向其他组合(节点,2)
对于u,v在可能的_边:
如果随机()
调整列表[u]。追加(v)
如果没有指示:
调整列表[v]。追加(u)
返回调整列表
示例:
>随机图(4,0.5)
[[1, 2, 3],
[0, 3],
[0],
[0, 1]]
>>>随机图(5,0.25,有向=真)
[[0, 2, 4],
[1, 4],
[0, 1, 2, 3],
[1],
[1, 2]]
有多种方法可用于生成具有特定统计特性的随机图。您在评论中已经说过,分布对于您的用例来说并不重要,因此使用一个简单的模型,它以一定的概率包含每个潜在的边,与是否包含其他边无关。这种分布通常称为G(n,p)
,其中n
是节点数,p
是包含边的概率
从G(n,p)
生成图形的算法非常简单:
- 使用
节点和无边初始化图形n
- 对于每对(无序/有序)节点
,u
:v
- 生成[0,1]范围内的随机实数
- 如果此数字小于
,则将边缘p
添加到图形中u-v
n
空列表的列表,“添加边”步骤将v
添加到u
(如果图形应该是无向的,则u
添加到v
的列表)
下面是Python中的一个示例实现:
从随机导入随机
来自itertools进口产品、组合
def随机图(n,p,*,directed=False):
节点=范围(n)
adj_list=[[]表示节点中的i]
可能的_边=产品(节点,重复=2),如果有其他指示