如何生成随机(不一定是二进制)树?

时间:2019-05-12 11:57:28

标签: python random tree generator sequence

我正在学习数据构造函数并尝试编写程序,这将为我生成一棵包含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

这显然不是一棵树。 我还担心的是,根是随机选择的,并移动到数组中的最后一个位置,但它永远无法连接到其他某个顶点。

我是否忘记了某些东西,或者只是此算法不起作用? 如果您知道生成随机树的其他算法,我将很乐意阅读。感谢您的任何事先帮助!

0 个答案:

没有答案
相关问题