Algorithm 生成一个具有n个真值,m条边的图的均匀随机算法

Algorithm 生成一个具有n个真值,m条边的图的均匀随机算法,algorithm,random,graph,probability,Algorithm,Random,Graph,Probability,简单的问题,没有找到简单的答案。我想要一个有N个顶点,M条边,均匀随机的图。在一个合理的时间复杂度内(我认为最坏情况下是准线性的)。这种算法存在吗?如果存在,是什么 编辑: 澄清:图形是无向的,没有多条边或循环边。应该是直截了当的。只需生成N顶点。然后M边。选择随机顶点作为源和目标。因为您没有额外的需求(如自动机语言),所以这是均匀分布的 V <- {1, ..., N} E <- {} for 1 to M do edge <- (random(V), random(

简单的问题,没有找到简单的答案。我想要一个有N个顶点,M条边,均匀随机的图。在一个合理的时间复杂度内(我认为最坏情况下是准线性的)。这种算法存在吗?如果存在,是什么

编辑:
澄清:图形是无向的,没有多条边或循环边。

应该是直截了当的。只需生成
N
顶点。然后
M
边。选择随机顶点作为源和目标。因为您没有额外的需求(如自动机语言),所以这是均匀分布的

V <- {1, ..., N}
E <- {}
for 1 to M do
    edge <- (random(V), random(V))
    E.push(edge)
return (V, E)
为了提高
contains
的效率,在实现时应该使用一些散列结构

问题在于
重复
循环。根据
random
的工作速度以及
M
与可能的边缘量的接近程度,可能需要一段时间。您可以使用诸如(另请参阅)之类的技术来加速此过程


如果
M
非常小,与最大值相比,它应该运行得很快(在
N
M
中呈线性),因为不会发生很多边碰撞。

应该很简单。只需生成
N
顶点。然后
M
边。选择随机顶点作为源和目标。因为您没有额外的需求(如自动机语言),所以这是均匀分布的

V <- {1, ..., N}
E <- {}
for 1 to M do
    edge <- (random(V), random(V))
    E.push(edge)
return (V, E)
为了提高
contains
的效率,在实现时应该使用一些散列结构

问题在于
重复
循环。根据
random
的工作速度以及
M
与可能的边缘量的接近程度,可能需要一段时间。您可以使用诸如(另请参阅)之类的技术来加速此过程


如果
M
非常小,与最大值相比,它应该运行得很快(在
N
M
中是线性的),因为不会发生很多边碰撞。

要高效地生成随机图,可以使用。 这是图论中的经典方法。生成随机图的Java代码(使用graphstream库)如下所示:

Graph g = new SingleGraph("Erdos-Renyi model");
// adding the first nodes
g.addNode("0");
g.addNode("1");
// creates the first edge
g.addEdge("0_1", "0", "1");
Integer i = 2;
while(i < numNodes) {
    Node source = g.addNode(i.toString());
    Node dest = g.getNode(random.nextInt(i)+"");
    g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
    i++;
 }
Graph g=新单图形(“鄂尔多斯仁义模型”);
//添加第一个节点
g、 addNode(“0”);
g、 addNode(“1”);
//创建第一条边
g、 附录(“0_1”、“0”、“1”);
整数i=2;
而(i
还有其他生成图形的模型,例如。该模型生成一个图,其中节点的连接越多,接收新链接的可能性就越大(描述富变富现象)。使用Barabási Albert模型生成随机图的Java代码为:

Graph g = new SingleGraph("Barabasi–Albert model");    
g.addNode("0");
g.addNode("1");
g.addEdge("0_1", "0", "1");
int sumDegree = 2;
Integer i = 2;
while(i < numNodes) {
    Node source = g.getNode(i.toString());
    if(source == null) {
          source = g.addNode(i.toString());
    }
    Node dest = g.getNode(random.nextInt(i)+"");
    double probability = dest.getDegree() * 1.0/sumDegree;
    double r = nextDouble();
    if(probability > r) {
       g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
        sumDegree = sumDegree + 2;
         i++;
       }
  }
Graph g=新的单图形(“Barabasi–Albert模型”);
g、 addNode(“0”);
g、 addNode(“1”);
g、 附录(“0_1”、“0”、“1”);
int-sumdese=2;
整数i=2;
而(ir){
g、 addEdge(source.getId()+“”+dest.getId(),source.getId(),dest.getId());
sumDegree=sumDegree+2;
i++;
}
}
另一个著名的方法是使用。在这种情况下,大多数节点不是彼此的邻居。然而,任何给定节点的邻居都可能是彼此的邻居,并且大多数节点可以通过少量的跳数从每个其他节点到达


如您所见,有几种可能生成随机图。根据所需的网络特性,应使用特定的模型。

要高效地生成随机图,可以使用。 这是图论中的经典方法。生成随机图的Java代码(使用graphstream库)如下所示:

Graph g = new SingleGraph("Erdos-Renyi model");
// adding the first nodes
g.addNode("0");
g.addNode("1");
// creates the first edge
g.addEdge("0_1", "0", "1");
Integer i = 2;
while(i < numNodes) {
    Node source = g.addNode(i.toString());
    Node dest = g.getNode(random.nextInt(i)+"");
    g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
    i++;
 }
Graph g=新单图形(“鄂尔多斯仁义模型”);
//添加第一个节点
g、 addNode(“0”);
g、 addNode(“1”);
//创建第一条边
g、 附录(“0_1”、“0”、“1”);
整数i=2;
而(i
还有其他生成图形的模型,例如。该模型生成一个图,其中节点的连接越多,接收新链接的可能性就越大(描述富变富现象)。使用Barabási Albert模型生成随机图的Java代码为:

Graph g = new SingleGraph("Barabasi–Albert model");    
g.addNode("0");
g.addNode("1");
g.addEdge("0_1", "0", "1");
int sumDegree = 2;
Integer i = 2;
while(i < numNodes) {
    Node source = g.getNode(i.toString());
    if(source == null) {
          source = g.addNode(i.toString());
    }
    Node dest = g.getNode(random.nextInt(i)+"");
    double probability = dest.getDegree() * 1.0/sumDegree;
    double r = nextDouble();
    if(probability > r) {
       g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
        sumDegree = sumDegree + 2;
         i++;
       }
  }
Graph g=新的单图形(“Barabasi–Albert模型”);
g、 addNode(“0”);
g、 addNode(“1”);
g、 附录(“0_1”、“0”、“1”);
int-sumdese=2;
整数i=2;
而(ir){
g、 addEdge(source.getId()+“”+dest.getId(),source.getId(),dest.getId());
sumDegree=sumDegree+2;
i++;
}
}
另一个著名的方法是使用。在这种情况下,大多数节点不是彼此的邻居。然而,任何给定节点的邻居都可能是彼此的邻居,并且大多数节点可以通过少量的跳数从每个其他节点到达


如您所见,有几种可能生成随机图。根据所需的网络特性,应使用特定的模型。

应简单明了。只需生成
N
ver