Algorithm 生成无向图的最简单方法&x2019;什么是邻接列表?

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-

我能找到的最接近的东西是:

但它不会随机生成图形。我想为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-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),如果有其他指示