擅长:python、mysql、java
<p>中位数算法是为快速选择算法开发的,它与快速排序非常相似,但实际上是线性的,而不是O(n logn),因为它只在分区的一侧递归。选择问题是在集合S中选择k<sup>th</sup>最大的元素;求中值是k=(| S |+1)/2的特殊情况。在</p>
<p>算法简单明了:</p>
<ul>
<li><p>选择一些轴值,p.</p></li>
<li><p>≥元素<S><S>lt&p><S>集合所有元素(lt&sub)<S>。</p></li>
<li><p>递归:如果S<sub><;</sub>至少是k,则找到S<sub><;</sub>中k<sup>th</sub>最大的元素;否则,求S<sub>中的(k-|S<sub><;</sub>)th</sup>最大元素。</p></li>
</ul>
<p>与快速排序一样,关键是找到轴值。我们将按如下方式进行:</p>
<ul>
<li><p>构造S<sub>中位数</sub>由S的每一组五个元素的中位数组成。</p></li>
<li><p>通过递归调用select,找到S<sub>中位数的精确中值。</p></li>
</ul>
<p>现在,| S<sub>中位数</sub>正好是0.2*S |。此外,一旦有了支点,我们知道max(| S<sub><;</sub>,| S<sub>≥</sub>)≤0.7*| S |。[fn 1]因此select的两个递归调用的总和为0.9*| S |。在</p>
<p>所以我们现在可以证明计算select的时间与∑0.9<sup>i</sup>n成正比,这在n中是明显的线性的</p>
<p>我希望这对你来说足够清楚。在</p>
<hr/>
<p>在不明显的情况下,s<sub>中位数</sub>中位值必须至少为p(因为p是它们的中位数),对于与这些中位数相对应的每五个中位数,五个元素中的三个(中位数和两个较大的元素)必须至少为p,因此这是s中元素总数50%的60%,或30%。类似的论点是用“最多”代替“至少”,所以我们知道两个子集中较小的至少是S大小的30%,因此较大的一个子集最多是S大小的70%。在</p>