老师在上课时说,selection algorithm 中的 median of medians,
若改成3个3个一组,时间复杂度就会超过O(n)。
但我用的第二种方法却无法得到这个结果,我哪里出错了?
====================================================
第一种方法:
原本的递回关系式(5个5个一组)会从
T(n) = T(n/5) + T(3/4*n) + O(n)
变成
T(n) = T(n/3) + T(3/4*n) + O(n)。
新的T(n) = O(n^{1+log_{4/3}(13/12)})。比O(n)大。
================================================
S_1 ˙˙˙˙˙
─────
˙˙˙˙˙
─────
˙˙*˙˙
─────
˙˙˙˙˙
─────
˙˙ S_2
================================================
第二种方法:
以下参考自:林立宇 2006 算法讲义 p.37 【算法 2-5】
The median of medians selection algorithm
Select(A[size n],k)
1. 将input的n个数每5个一组,除了最后一组不足5个数,而是n mod 5个。
总共ceiling(n/5)组。
2. 将每组作sorting,并求得各组之median。
3. 将step 2得到的ceiling(n/5)个median当input,递回去求medians的median,p。
4. 从n个数中,收集小于与大于p的数,分别放入集合S_1与S_2。(见上图)
5. 假设p为第x小的数。
若k=x,则return p;
若k<x,则去掉被S_2包含的数,再递回求剩余数中第k小的数;
若k>x,则去掉被S_1包含的数,再递回求剩余数中第k-|S_1|小的数。