我正在学习数据构造函数并尝试编写程序,这将为我生成一棵包含n个顶点的树(不一定是二进制树)。到目前为止,我尝试了Prufer序列,并且对我来说很好用-这是一个非常有趣的问题解决方案。我发现带有Fast Random Tree Generating Algorithm的纸张(第881-882页)。
实际上,我并不真正在乎生成速度,但是此方法应该比从Prufer序列生成树更快。我编写了代码来生成它,但不确定它是否正确运行。我的代码或上述论文中介绍的方法出了点问题。下面我展示了我的作品。代码是用Python3编写的。 请注意,我更改了索引,因为Python的索引为0。
import random
def fast_random_tree(n):
"""
https://link.springer.com/content/pdf/10.1007/3-540-44862-4_95.pdf
"""
I = list(range(n)) # Initial vector of node numbers
root = random.randint(0, n - 2) # choosing root
I[root], I[-1] = I[-1], I[root] # replacing with last value
edges = [None for _ in range(n - 1)]
for m in range(n - 1):
t = random.randint(0, m) # new node
s = random.randint(m + 1, n - 1)
edges[m] = (I[t], I[s]) # adding edgde
I[t], I[n - m - 1] = I[n - m - 1], I[t] # replaceing from n-m+1 to n - nodes that are in a tree already
return edges
if __name__ == '__main__':
edges = fast_random_tree(5)
print(edges)
有时我会收到一组不会创建树的边,因为它包含循环或图形未完全连接。示例:
>>> print(fast_random_tree(5))
[(0, 4), (0, 3), (1, 2), (2, 1)]
0 1
/ \ |
4 3 2
这显然不是一棵树。 我还担心的是,根是随机选择的,并移动到数组中的最后一个位置,但它永远无法连接到其他某个顶点。
我是否忘记了某些东西,或者只是此算法不起作用? 如果您知道生成随机树的其他算法,我将很乐意阅读。感谢您的任何事先帮助!