这里的问题是减少选择排序中所需的平均比较次数。
我正在阅读关于此的文章,这里是文本片段:
更一般地说,从 n 中选择 s 元素的样本 S' 元素。让“ delta ”成为某个数字,我们稍后会选择 最小化平均使用的比较数 程序。我们发现( v1 =( k * s )/( n - delta ))和( v2 =( k * * s )/( n + delta ) ) S'中的最小元素。几乎可以肯定,kth最小 S 中的元素将介于 v1 和 v2 之间,因此我们留下了 选择问题( 2 * delta )元素。概率很低的 第k个最小元素不属于这个范围,我们有 相当多的工作要做。但是,通过选择 s 和 delta , 我们可以通过概率法确保第二种情况 不会对整体工作产生不利影响。
我不遵循上述文字。任何人都可以用例子向我解释。作者如何减少 2 * delta 元素?他怎么知道元素不属于这一类别的可能性很低。
谢谢!
答案 0 :(得分:0)
该想法的基础是正常选择算法具有线性运行时复杂性,但实际上很慢。我们需要以五个为一组对所有元素进行排序,并递归地执行更多工作。 O(n)
但是常数太大了。那么,想法是减少选择算法中的比较次数(不一定是选择排序)。直觉上它与基本统计中的相同;如果我采用足够大比例的样本子空间,则子空间中的数据分布可能足以反映整个空间中的数据。
因此,如果我正在寻找一百万大小的第k个数字,我可以改为说10 000(已经是大小的百分之一),这仍然足够大,可以很好地代表全球分布,并寻找k / 100号码。那是简单的缩放。所以如果空间是10而我正在寻找第3个,这就像寻找100中的第30个,或者1000中的第300个等等。基本上k/S = k'/S'
(我们在那里寻找S中的第k个数字,我们将它转换为S'我们的子空间中的第k个数字,因此k' = k*S'/S
应该看起来很熟悉,因为在你引用的文本中,S'用s表示,S用n表示,这是相同的引用的分数。
现在,为了将统计波动考虑在内,我们不假设子空间将是数据分布的完美表示,因此我们允许一些波动,即delta。我们说让我们在S'中找到k'th-delta和k'th + delta元素,然后我们可以非常肯定地说(即高数学概率)来自S的第k个值在区间(k'th-) delta,k'th + delta)。
为了将它全部包装起来,我们在S'上执行这两个选择,然后相应地对S进行分区,现在在分区中的小得多的间隔上进行[normal]选择。这最终对于区间之外的元素几乎是最佳的,因为我们不对它们进行选择,只对它们进行分区。因此选择过程更快,因为我们已将问题大小从S减少到S'。