我正在阅读Robert Segdewick的C ++算法中的随机二进制搜索树。
随机数发生器仍然有可能在每次机会时导致错误的决定,从而使我们得不到平衡的树木,但我们可以用数学方法分析这个机会并证明它很小。
财产13.2。 :随机BST的建设成本大于平均值α倍的概率小于e-α
例如,构建100,000个节点的随机BST需要大约230万次比较,但比较次数超过2300万次的概率远小于0.01%。这种性能保证足以满足处理这种大小的实际数据集的实际要求。当使用标准BST进行此类任务时,我们无法提供这样的保证:例如,如果数据中存在重要顺序,则我们会遇到性能问题,这在随机数据中不太可能,但在实际情况下肯定不会出现异常数据,有很多原因。
类似于Property 13.2的结果也适用于quicksort的运行时间,同样的论点。但结果在这里更为重要,因为它还意味着在树中搜索的成本接近平均值。无论构建树的任何额外成本如何,我们都可以使用标准的BST实现来执行搜索操作,其成本仅取决于树的形状,并且没有额外的成本用于平衡。此属性在典型应用程序中很重要,其中搜索操作比其他任何应用程序都要多得多。例如,前一段中描述的100,000节点BST可能包含电话目录,可能用于数百万次搜索。我们几乎可以肯定,每次搜索都会在大约23次比较的平均成本的一个小常数因子内,并且,出于实际目的,我们不必担心大量搜索的成本可能接近100,000比较,而对于标准的BST,我们需要关注。
我对上述文字的质询是
由于
答案 0 :(得分:0)
嗯,你已经提到了quicksort,这是这种算法的一个很好的例子。 Quicksort的最坏情况表现为O(N^2)
。但是,它是全世界使用最广泛的排序算法之一。
为什么使用这样的算法? 因为最坏的情况真的很少见。非常罕见,即使它出现一次或两次也值得使用该算法。它可以比保证解决方案更容易实现,它可以更好地与当代硬件(缓存)等合作。 / p>
使用quicksort而不是heapsort通常会更好,即使heapsort理论上更好(在最坏的情况下消耗O(1)
额外内存和O(N log N)
时间。
所以,在我看来,这本书想说随机BST值得使用,即使事情可能会向南发展。仅仅因为这种情况的概率确实非常低。在实时系统的关键部分使用这种结构并不是一个好主意。但是,对于普通应用程序,使用随机结构可能会有所帮助。因为与自平衡树一样好的概率非常高。因为你节省了很多时间而不编码自平衡。 CPU时间便宜,开发人员的时间很长。
就个人而言,我在编写union-find时使用随机方法。对于保证最坏情况的复杂性,您应该将较小的集合加入较大的集合,我随机执行此操作。它节省了几行,一些记忆,我没有注意到实际中随机版和保证版之间的差异。
答案 1 :(得分:0)
因此,概率分布将是二项分布,对于大数而言,其具有一些均值和方差近似正态。所以他的命题在概念上等同于Chebyshev's Inequality。
基本上,它说分布的尾部小于一定数量,并且大部分分布在距离中心一定距离内。
答案 2 :(得分:0)
这是一个特定的界限。修复j
和n
以及1 <= j <= n
。想象一下元素1..n上的随机BST,并且对于所有k >= 0
,让T(k)
为以j
的祖先为根的子树的大小,其深度为k
(如果0
的深度小于j
,则为k
。然后,
T(0) = n
E[T(k) | T(k - 1)] <= (3/4) T(k - 1),
通过以下逻辑。设m = T(k - 1)
并假设m > 0
。在i
种可能性中统一选择等级m
的子树根。在最坏的情况下,j
位于较大的子树中,因此T(k) <= max(i - 1, m - 1 - i)
。计算期望,
E[T(k) | m] <= sum_{i : 1 <= i <= m} max(i - 1, m - 1 - i)/m
= sum_{i : 1 <= i <= m - floor(m/2) - 1} (m - 1 - i)/m
+ [m even] ((m - 1)/2)/m
+ sum_{i : floor(m/2) + 1 <= i <= m} (i - 1)/m
= sum_{i : floor(m/2) + 1 <= i <= m} 2 (i - 1)/m
+ [m even] (m - 1)/(2 m)
= floor(m/2) (floor(m/2) + m - 1)/m
+ [m even] (m - 1)/(2 m).
如果m
是偶数,那么界限是
(m/2) (m/2 + m - 1)/m + (m - 1)/(2 m) = (3 m/2 - 1)/2 + 1/2 - 1/(2 m)
< (3/4) m.
如果m
为奇数,则界限为
((m - 1)/2) ((m - 1)/2 + m - 1)/m < (m/2) (m/2 + m)/m = (3/4) m.
现在,通过期望的线性,我们计算
E[T(k)] <= (3/4)^k n.
当且仅当k
时,二元搜索在T(k) >= 1
比较后才有效。很明显
Pr(T(k) >= 1) <= E[T(k)],
,以更一般的形式,被称为马尔可夫的不等式。如果我们设置k = 3 log_{4/3} n ~ 7.23 lg n = O(log n)
,则搜索仍处于活动状态的概率最多为(3/4)^k = n^-3
。联盟绑定了所有元素,某些元素太深的概率最多为n^-2
。到n = 1e5
时,这已经超过了十亿分之一。