1973年,Blum、Floyd等几位大仙合并一体,写了一篇题为 “Time bounds for selection” 的章,给出了一种在数组中选出第k小元素的算法,俗称"中位数之中位数算法"。该算法从理论上保证了最坏情形下的线性时间复杂度(O(n))。而一个简单的排序算法像快速排序的时间复杂度是O(nlogn),利用类似于快速排序的做法是:首先对该无序数组进行排序(O(nlogn)),然后进行一次遍历(O(k))就可以找到第k小元素。下面我们来重点看看中位数排序法。
该算法使用分而治之的策略,查找到第K小元素在最坏情况下的时间复杂度为O(n)。
实现该算法的步骤如下:
1.如果n是一个比较小的数,比如n<6,那么只需要对此无序数组进行排序后,即可很容易的得到第K小元素。
此时约束时间T=7。
2.如果n>5,那么我们将这个无序数组分成五组。此时约束时间T=n/5。
3.找出每组的中位数,构成集合M。此时的约束时间T=7n/5.
4.递归的调用selection(M,|M|/2)算法查找上一步中所有中位数的中位数,设为m。此时的约束时间
T=T(n/5)。
5.用m来分割此时的数组,比较m与其他的(n-1)个数,小于m的数置于左集合L,大于m的数置于右集合R。当
然,中位数m的下标r=|L|+1(|L|是左集合L的个数)。此时的约束时间T=T(n)。
如果r=k,那么返回m。
如果r<k,那么在小于m的左集合L中递归查找第K小数。
如果r>k,那么在大于m的右集合R中递归查找第K小数。
递归方程:T(n)=O(n) + T(n/5) + T(7n/10) (证明过程略)
如果你想知道怎样得到次方程的,不妨找一本关于算法的书看一看或直接给我留言,谢谢!
另外,我想说的是:我为什么分为五组而不是分为其他的组。
假设我们将此数组分为三组,那么有:T(n) = O(n) + T(n/3) + T(2n/3) so T(n) > O(n)。如果我
们将此数组分成五组以上,那么就会显得有些麻烦了,所以分为五个组是最理性的选择。
由于鄙人的翻译水平所致,文中不妥之处还望各位指出来,谢谢!
分享到:
相关推荐
### 线性时间选择中位数算法 #### 实验目的 1. **掌握线性时间选择的基本算法及其应用:** 线性时间选择算法是一种可以在平均或最坏情况下达到线性时间复杂度的选择算法,它主要用于在无序数组中找到第k小的元素。...
线性时间选择算法是一种在计算机科学中用于在数组或序列中找到第k小(或大)元素的高效方法。这个算法特别关注效率,目标是在线性时间复杂度O(n)内完成,其中n是数组的长度。在描述线性时间选择算法实现之前,我们先...
3. 递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。 4. 用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。 5. 若i==k,返回x;若i<k,在...
具体而言,我们不是随机选择枢轴,而是将所有元素分成若干组,每组若干个元素,选取每组的中位数,再对这些中位数选取中位数作为枢轴。这种方法有效地减少了最坏情况下枢轴选取的不均衡性,从而保证了算法的线性时间...
如果k小于数组长度的一半,那么第k小的元素一定在中位数左侧的子数组中;反之,在右侧。这个方法通常用于并行计算和分布式系统,因为可以将任务有效地分配到多个处理器上。 5. **计数排序法**: 如果数组元素范围...
第九章聚焦于“中位数和顺序统计量”,这些概念在数据分析、数据挖掘以及算法设计中扮演着重要角色。中位数是数据集中间的平衡点,而顺序统计量则涉及对数据集中的特定位置值的查询。我们将深入探讨这两个概念及其C#...
线性时间选择 算法设计与分析,是实验程序……
`select` 函数是一种在未排序数组中查找第 k 小元素的算法,它可以在最坏情况下实现线性时间复杂度 O(n),因此整个过程都在线性时间内完成。 总结来说,利用中位数作为输油管道的位置,可以确保在所有可能的位置中...
另一个例子是,在数据流中求中位数的问题,由于无法存储所有数据,必须采用数据流算法,利用亚线性时间策略决定应当存储哪些数据。 除了前面提到的算法之外,亚线性算法还包括数据流算法和近似算法。数据流算法针对...
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它用于对一组数据进行有序排列。本资源提供的Java实现包括了三种线性排序算法:桶排序(Bucket Sort)、基数排序(Radix Sort)和计数排序(Counting Sort...
- (b) 可以使用快速选择算法,它是一种基于快速排序的算法,可以在最坏情况下达到O(n log n)的时间复杂度来寻找权重中位数。 - (c) 分治算法可以将问题分解为两半,分别找到左右两边的权重中位数,然后比较确定...
该算法的核心思想是使用分治策略将原始数组分解成小规模的数组,然后递归地选择每个小数组的中位数,以获得所需的答案。 算法实现 该算法的实现主要包括六个函数: 1. 交换函数 swap():用于交换两个整数的值。 2...
### 周期为2^n的二元序列k错线性复杂度的快速算法 #### 概述 本文介绍了一种针对周期为2^n的二元序列k错线性复杂度的快速算法。该算法是在已有Games-Chan算法的基础上进行改进和发展起来的,主要目的是提高算法...
在图像处理领域,本次分享的压缩包包含了多个关键知识点,主要涵盖了图像资料数据重建与拟合、K均值聚类图像分割、中位数算法运动目标检测、贝叶斯判别手写体数字识别以及主成分分析(PCA)图像压缩与重建。...
**计数排序**是一种特殊的线性时间排序算法,适用于输入数据范围较小的情况。该算法假设输入元素为m个整数,这些整数的范围在[1, k]之间。计数排序的主要步骤包括: 1. **初始化计数数组**:创建一个大小为k的计数...
- **利用中位数进行线性时间选择:** 这种方法的核心思想是先找到整个序列的中位数,然后根据中位数的位置进一步缩小查找范围,直到找到第k小的元素为止。 #### 算法描述 1. **随机快速排序** - 随机快速排序...
【部分内容】讨论了寻找最小k个数的几种方法,包括基于堆的实现和快速选择算法,特别是快速选择算法中的"五分化中项的中项"或"中位数的中位数"作为主元的选择策略,以确保在最坏情况下仍具有O(N)的时间复杂度。...
### 算法与数据结构:选择问题及逆论 #### 一、选择问题概述 ...综上所述,通过上述算法可以有效地解决选择问题,特别是在求中位数的情况下,可以在线性时间内得到答案,这在大数据处理和高效算法设计中具有重要意义。
Devillard提出的快速中位数查找算法使用了基于分区的选择算法,如快速选择算法(Quickselect)和中位数的中位数(median-of-medians)算法,这些算法比传统排序方法有着更低的时间复杂度。快速选择算法是快速排序...
在“算法导论系列读书笔记之九”中,我们聚焦于其中的两个重要概念:中位数和顺序统计学。 中位数是统计学中的一个关键概念,它是将一组数据从小到大排列后位于中间位置的数值。对于奇数个数据,中位数是中间的那个...