Algorithm 在O(logn)时间内从二叉树中获取随机数

Algorithm 在O(logn)时间内从二叉树中获取随机数,algorithm,random,binary-tree,Algorithm,Random,Binary Tree,是否有可能在O(logn)时间内从平衡二叉搜索树中获得均匀分布的随机值(调用该函数意味着它同样有可能获得树中的任何值) 我最初的想法是生成一个随机数0、1或2。如果为0,则从当前节点获取左侧路径,如果为1,则获取右侧路径,否则节点的值为随机值。如果命中叶节点,则取该节点的值。但我不认为这是随机分布的 这是出于好奇,不是针对特定的应用 如果您需要任何澄清,请告诉我 例如,如果你有一棵树 1 / \ 2 5 / 3 调用int get\u ra

是否有可能在O(logn)时间内从平衡二叉搜索树中获得均匀分布的随机值(调用该函数意味着它同样有可能获得树中的任何值)

我最初的想法是生成一个随机数0、1或2。如果为0,则从当前节点获取左侧路径,如果为1,则获取右侧路径,否则节点的值为随机值。如果命中叶节点,则取该节点的值。但我不认为这是随机分布的

这是出于好奇,不是针对特定的应用

如果您需要任何澄清,请告诉我

例如,如果你有一棵树

     1
    / \
   2   5
       /
      3
调用
int get\u random\u number()


澄清:所有其他正常的BST操作都应该保持O(log n),如insert()、delete()等。

您的想法不会产生随机分布。无论树有多大,树根都有1/3的几率被采摘


如果您知道树中元素的数量,则生成一个介于1和N之间的数字k,并获得树中第k个最大的元素。有关平衡树的O(logn)中的方法,请参见。

哪部分?也许我应该举个例子?制服?只需选择一个随机整数@Aziz。如果你选择最后一个节点,那就是O(n)时间。但实际上,你只想从树中选择一个(均匀的)随机节点?(上面正好有一个数字)@wildplasser如果将树作为数组保存,则除非进行二进制搜索,否则查找要删除的元素将是O(n),但随后必须对其进行排序,这样它就不会保留O(log n)。我也不明白你说的“只有大O才会变大”是什么意思。这就是我所关心的…这很聪明。我将阅读该链接,如果没有更好的答案,可能会选择此链接。