algorithm - 以随机算法均匀生成具有 n 个顶点、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)
编辑:澄清:该图是无向的,没有多边或循环。
继续生成随机边,直到你有一个有效的边:
V <- {1, ..., N}
E <- {}
for 1 to M do
repeat
source <- random(V)
edge <- (source, random(V \ {source}))
until E does not contain edge
E.push(edge)
return (V, E)
用于目标random(V \ source)
以排除循环。E does not contain edge
不应该关心方向。即它应该考虑
(a, b) = (b, a)
为了提高效率,contains
您应该在实现时使用一些散列结构。
问题是repeat
循环。根据random
工作的速度以及与可能的边缘数量的接近M
程度,可能需要一段时间。您可以使用Floyd-Rivest 算法等技术加快此过程(另请参阅算法以选择单个随机值组合?)。
如果M
与最大数量相比相当小,它应该运行得很快(在N
和中线性M
),因为您不会遇到很多边缘冲突。
推荐阅读
- html - div 在 CSS 悬停时向上滑动
- c++ - CMake + VSCode:configure_file 和 linting
- python-3.x - 从同一目录运行多个 Colab Notebook
- scala - Scala 期货 - java.util.concurrent.RejectedExecutionException
- python - 在 python 中为 Binance 创建 Freqtrade 策略时,如何获取刚刚结束的蜡烛的信息?
- xamarin.forms - 自定义引脚(注释)xamarin 形式 ios 在 14 以下版本上未更改
- javascript - BleManager 反应原生
- c# - 从基类调用上下文时对象处理异常
- c++ - 指向对象的指针的继承问题
- scala - 如何在 Scala 的 Apache Flink Datastream 中转换字符串?