相关问题:
给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k≤n后,它能确定出S中最接近其中位数的k个数.
思考过程:
如果给出在线性时间内的算法,那么可能要用到最坏为线性时间的查找第i小元素的子程序SELECT。我们先找到这n个数的中位数,然后以此中位数为中心,左边距离中位数k/2个远的位置是这k个数的左端点,右边距离中位数k/2个远的位置是这k个数的右端点。用SELECT函数找到这三个数(中位数,左边距离中位数k/2的数,右边距离中位数k/2的数)就可以确定最接近其中位数的k个数.。
PS:在网上这个问题没有用到这种方法。所以这种方法的正确性有待各位大牛来验证。如果有错误,请各位大牛留言指正哦。谢谢啦!
具体步骤:
step 1:用SELECT函数找到中位数,找到的同时也对数组进行了划分(step123都是根据《算法导论》9.3-4题目的结论,有兴趣可以看这篇博文),小于中位数的在左边,大于的在右边。
step 2:用SELECT函数找到左边距离中位数k/2的数,(注意不要对整个数组进行SELECT函数查找,要对中位数左半区域进