添加1000个随机整数时,如何计算二叉搜索树的平均高度?平均身高是多少?
答案 0 :(得分:10)
这个问题让我问你是否可以在没有实际产生树木的情况下明确地解决这个问题。
我设法编写了一个应用程序,可以计算出如果你将N个唯一数字的每个可能的排列添加到一个天真实现的二叉树中的平均高度的答案。
我得到的答案在这张图中。 (X轴是树中的项目数,蓝线是平均高度,红线是最佳可能高度)
N Average Height 2 2 16 7.039 32 9.280 64 11.679 256 16.783 343 17.896
Granitebolshevik是对的:它是可能的,但在统计上不太可能一个天真实施的树将是最佳高度,没有额外的平衡功能。
该算法的复杂度为O(N ^ 2),并且计算真正的大数字的速度还不够快。
答案 1 :(得分:4)
您可以使用此递归定义计算二叉树的高度:
height(empty) = 0
height(tree) = 1 + max(height(tree.left), height(tree.right))
凭经验测量这种树的平均高度的一种方法是重复创建一个空树并向其添加1000个随机项。使用上述功能测量每个试验的高度,并对它们取平均值。
我怀疑你的任务可能是找到二叉树平均高度的公式。
答案 2 :(得分:4)
这取决于您是否使用任何类型的平衡树结构(例如红黑树)。由于您将随机数插入到二叉树中,因此期望平均深度大约为log2(1000)是合理的 - 因此值10和11将是“正常”。我不确定它可以偏离多远;不浅10级,可能更深一些。没有平衡的极端情况将是1000深;随机数不太可能发生。
答案 3 :(得分:3)
这个问题似乎没有一个简单的答案,尽管有许多数字近似值,例如:
Devroye,Luc。 “关于二叉搜索树高度的说明。” ACM期刊(JACM)33.3(1986):489-498。
里德,布鲁斯。 “随机二叉搜索树的高度。” ACM期刊(JACM)50.3(2003):306-332。
http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap13.htm
这些近似值通常采用以下形式:A ln n - B ln ln n + C
A~4.311
和B~1.953
因此,最有用的可能是随机插入的平均高度为O(log n)
,但如果您确实需要数值近似,我认为(4.311 ln n - 1.953 ln ln n)
对于大n来说足够接近。< / p>
对于n=1000
,这给出了26
- 这非常符合其他地方报告的实验结果。
答案 4 :(得分:1)
这个问题其实很棘手。答案不会是1000,因为这是不可能的,但log2(1000)也是不可能的,但更多的是取决于树的生长方式。
如果你通过踩过树来添加一个int然后天真地附加它,那么树几乎总是比log2(1000)高。
与统计学家交谈,因为这似乎与正态概率分布有关。这些是由大量迭代的随机事件生成的(一个单元右侧,尾部同上左侧),一个随机整数的值在树结束时迭代穿过树。
答案 5 :(得分:0)
取决于添加的顺序。如果从最小值开始,则树将更深,因为所有新值都将添加到右子BST。如果您先添加最大值,则左侧子项将为深,而右侧为空。
答案 6 :(得分:-2)
无论你使用什么树,平均身高都将是log2(1000),就像前面提到过的人一样。确实,根据插入数字的顺序,实际高度可能会有所不同,但假设您提到的随机分布数字,那么实际值通常会接近预期值(再次,这是log2) (1000))