我在算法书中得到了以下问题:
假设实现了合并排序,以便在随机位置拆分文件,而不是恰好在中间。这种方法可以使用多少次比较来平均排序n个元素?
感谢。
答案 0 :(得分:2)
为了引导您找到答案,请考虑以下更具体的问题:
假设分割始终为10%,或25%,或75%,或90%。在每种情况下:对递归深度的影响是什么?每个递归级别需要进行多少次比较?
答案 1 :(得分:0)
我部分同意@Armen,他们应该具有可比性。
但是:考虑一下它们在中间分裂的情况。要合并两个长度n
的列表,我们需要2*n - 1
个比较(有时候会更少,但为了简单起见,我们会认为它是固定的),每个都会生成下一个值。合并会有log2(n)
级,这为我们提供了约n*log2(n)
次比较。
现在考虑随机拆分案例:将长度为n1
的列表与长度为n2
的列表合并所需的最大合并次数为n1 + n2 - 1
。然而,平均数将接近它,因为即使是最不幸的分裂1
和n-1
,我们也需要平均n/2
次比较。因此,我们可以认为每个级别的合并成本与偶数情况相同。
不同之处在于,在随机的情况下,级别的数量会更大,我们可以认为下一级n
将是max(n1, n2)
而不是n/2
。 max(n1, n2)
3*n/4
往往为n*log43(n) // where log43 is log in base 4/3
,这为我们提供了近似公式
n * log2(n) / log2(4/3) ~= 2.4 * n * log2(n)
给了我们
{{1}}
这个结果仍然比正确的结果大,因为我们忽略了小列表的级别会更少,但它应该足够接近。我想正确的答案是平均比较次数会加倍
答案 2 :(得分:0)
使用合并两个总长度n列表最多n次比较的事实,您可以获得2n * H_ {n - 1} <= 2n ln n的上限。分析类似于随机快速排序(见http://www.cs.cmu.edu/afs/cs/academic/class/15451-s07/www/lecture_notes/lect0123.pdf)。
首先,假设我们将长度为n的列表分成2个列表L和R.我们将对R的第一个元素进行充电,以便与L的所有元素进行比较,并将L的最后一个元素与所有元素进行比较R的元素尽管这些可能不是执行的确切比较,但我们收取的比较总数是n。
这处理一个级别的递归,但其余的呢?我们继续只关注R的第一个元素和L的每个元素之间在所有递归级别上发生的“从右到左”的比较(通过对称性,这将是实际预期总数的一半)。将第j个元素与第i个元素进行比较的概率是1 /(j-i),其中j> 1。一世。为了看到这一点,请注意,当元素j是从集合{i + 1,...,j}中选择作为“分裂元素”的第一个元素时,元素j与元素i完全比较。也就是说,一旦它们所在的列表被分割为{i + 1,...,j}中的某个元素,则元素i和j被分成两个列表,并且元素j被收费用于与i进行比较时element j是从这个集合中选择的元素。
因此,涉及j的预期比较总数最多为H_n(即,1 + 1/2 + 1/3 ......,其中项的数量最多为n-1)。对所有可能的j求和得到n * H_ {n-1}。这仅计算“从右到左”的比较,因此最终上限为2n * H_ {n - 1}。