如何从树中选择随机元素?是否有必要事先知道树的深度/大小?
答案 0 :(得分:14)
不是。要随机选择一个节点,只需按照您喜欢的顺序遍历树。让检查的第n个节点是概率为1 / n的所选节点。也就是说,保留您将在变量中返回的节点的记录,当您查看第n个节点时,将当前节点替换为第n个概率为1 / n的节点。您可以通过归纳显示这会随机均匀地返回一个节点,而无需事先知道有多少节点。
答案 1 :(得分:2)
如果你已经将你的叶子结构化为一个可索引的数据类型(如数组),那么你可以很容易地(伪代码):
random_leaf = leaf_pile[ random( size of leaf pile ) ]
这是一个很好的,令人耳目一新的O(1): - )
当然,可能存在漏洞,因此您可能需要从那里进行迭代。如果它存储为链表,那么你可以迭代。
只提供明显的替代方案。这实际上取决于您的数据结构和最常见的用例。
答案 2 :(得分:-1)
为每个节点做一次0到(子项数)-1范围内的随机调用,然后选择该数字后面的下一个孩子。
重复此操作,直到你落叶。