算法导论(九)--中位数和顺序统计学yourtommy

在一个由元素组成的集合里,第i个顺序统计量(orderstatistic)是该集合第i小的元素。例如,最小值是第1个顺序统计量(i=1),最大值是第n个顺序统计量(i=n)。一个中位数(median)是它所在集合的“中点元素”。当n为奇数时,中位数是唯一的,i=(n+1)/2;当n为偶数时,中位数有两个,一个是i=floor((n+1)/2)(下中位数),另一个是i=ceiling((n+1)/2)(上中位数)。在不考虑n的奇偶性的情况下,中位数总是出现在i=floor((n+1)/2)处和i=ceiling((n+1)/2)处。

最小值和最大值

在一个有n个元素的集合里,要找到最小元素,可以用下面的代码:

如果要同时找出最大值和最小值,我们很容易想到让每一个元素分别和min和max比较,这样每个元素要进行2次比较,而总的比较数就为2*n-2。事实上只需3*floor(n/2)次比较就可以同时找到最小值和最大值。我们并不让每个元素同时与min和max比较,而是取两个元素先比较,较大的元素与max比较,而较小的元素与min比较,这样每两个元素要做3次比较,总的比较次数最多为3*floor(n/2)。

如果我们不选最大值或最小值,而是选一个第i小的值。我们可以用一种分治算法——RAMDOMIZED_SELECT,它以快速排序为模型:把数组随机划分为两部分,A[p...q-1]的元素比A[q]小,A[q+1...r]的元素比A[q]大。与快速排序不同,如果i=q,则A[q]就是要找的第i小的元素,返回这个值;如果iq,则说明第i小的元素在A[q+1...r]里。

下面是在A[p...r]中找到第i小元素的代码:

设指示器随机变量X_k=I{子数组A[p...q]中恰有k个元素}这样,元素数量为n的数组在每次划分时,就会被划分为1...k-1,k,k+1...n三部分。下次递归时,就可以作用在1...k-1(共k-1个元素)区间或k+1...n(共n-k个元素)区间上。考虑X_k所有可能的取值,则可以得到递归式:T(n)≤∑X_k*T(max(k-1,n-k))+O(n)=∑(X_k*T(max(k-1,n-k))+O(n))

由于X_k为1的概率为1/n,取期望值,得到:E(T(n))≤E[∑(X_k*T(max(k-1,n-k))+O(n))]=∑E[(X_k*T(max(k-1,n-k))]+O(n)=∑E[X_k]*E[T(max(k-1,n-k))]+O(n)(X_k与T(max(k-1,n-k))独立)=∑1/n*E[T(max(k-1,n-k))]+O(n)

考虑max(k-1,n-k),如果k>ceiling(n/2),其值为k-1;若k≤ceiling(n/2),其值为n-k。所以∑T(max(k-1,n-k))≤2*∑T(k),于是有:E(T(n))≤2/n*∑E[T(k)]+O(n)

相比于上面的随机选择,我们有另一种类似的算法,它在最坏情况下也能达到O(n)。它也是基于数组的划分操作,而且利用特殊的手段保证每次划分两边的子数组都比较平衡。

首先我们需要稍微修改一下PARTITION算法(不是RANDOMIZED_PARTITION),它接收一个数组和一个值x,并把它划分为小于x和大于x的两部分(x为A中某个元素的值):

在修改划分算法后,我们通过以下步骤来实现在n个元素的数组中找第i小元素的SELECT:1、把数组A分成ceiling(n/5)个组,除最后一组外,每组都有5个元素,最后一组有nmod5个元素;2、对每组(的五个元素)用插入法进行排序,然后选出该组的中位数,即排好序的第三个元素;3、对于步骤2中得到的所有的中位数,通过递归调用SELECT来找到它们的(下)中位数x,(也就是找到第2步得到的所有中位数中第floor(ceiling(n/5)/2)小个元素);4、利用修改后的划分算法把元素分成小于x和大于x的两个子数组。如果设k为划分低区的元素个数加一,则x就是A中第k小的元素;5、如果i=k,那我们就返回x,它便是我们要找的值。如果ik,我们就在划分高区递归调用SELECT找第i-k小的数。

下面是伪代码:

综上所述,可以得到递归式:T(n)≤T(floor(n/5))+T(7*n/10+6)+O(n)

用代换法来解上面的递归式,设c,a为正常数得:T(n)≤c*(floor(n/5))+c*(7*n/10+6)+a*n≤c*(n/5)+c*(7*n/10+6)+a*n=9*c*n/10+7*c+a*n=c*n+(-c*n/10+7*c+a*n)

THE END
1.算法分析与设计本文介绍了两种线性时间选择算法:RandomizedSelect和Select,用于在给定的线性序集中寻找第k小的元素。RandomizedSelect通过随机选取基准元素进行划分,平均时间复杂度为O(n);Select算法通过固定基准划分,通过多次选择中位数优化,最坏情况下时间复杂度也为O(n)。这两种算法在实际应用中提供了高效的元素查找解决方案。 摘要https://blog.csdn.net/qq_50737715/article/details/123948915
2.算法设计与分析(线性时间选择算法51CTO博客线性时间选择算法(QuickSelect)实现 线性时间选择算法是快速排序算法的一个变种,用于在未完全排序的数组中找到第k小的元素。线性时间选择算法的平均时间复杂度为O(n),但最坏情况下的时间复杂度仍然是O(n^2)。通过随机选择基准点(pivot),可以在一定程度上避免最坏情况的发生。 https://blog.51cto.com/u_16672541/12100853
3.线性时间选择常见问题给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。在某些特殊情况下,很容易设计出解选择问题的线性时间算法。如:当要选择最大元素或最小元素时,显然可以在O(n)时间完成。https://m.php.cn/faq/423439.html
4.线性时间选择给定序列,使用线性时间复杂度,寻找出第k小的元素 问题来源:当k是最小或最大的元素时,可以一遍遍历所有的元素,就找到第k小的元素 遂第k小元素的寻找时间有下界:O(n)算法思想:寻找Partition函数的最优基准(找到新的划分基准) 原理:一个好基准,可以帮助下一次递归去除更多的无用元素,减少递归规模,从而减少时间https://www.jianshu.com/p/a96c1326684d
5.时间复杂度常见的非合次线性时间算法都采用了诸如平行处理(就像NC1 matrix行列式计算那样)、非古典处理(英语:Quantum algorithm)(如同葛罗佛搜索那样),又或者选择性地对有保证的输入结构作出假设(如幂对数时间的二分搜索)。不过,一些情况,例如在头 log(n) 比特中每个字符串有一个比特作为索引的字符串组就可能依赖于输入的每个http://mp2.allhistory.com/detail/5924158b55b54278ac0026ee
6.第十一章线性规划的多项式时间算法如果存在求解线性规划问题 (11.1.3)的多项式时间算法, 能够 判定 ( 11.1.3)不可行或 无界或达到最优解 , 则当( 11.1.3)不可行时,线性 不等式组 (11.1.2)无解;当( 11.1.3)无界或达到最优解时,我们得到了线性不等式组 (11.1.2)的一个解 . 这表明该算法在多项式时间能够求解线性不等式组 (11.1.2)http://www.360doc.com/document/22/1020/10/32929879_1052444973.shtml
7.算法中七种常见的时间复杂度作为程序员,我们经常努力编写旧能这篇文章介绍了算法中七种常见的时间复杂度,包括大 O 表示法的定义和作用,用简单的术语解释算法、运行时间、输入规模等概念,列举了七种时间复杂度的常见例子,如常数、对数、线性等,并在最后指出还有更多相关内容可学习。 关联问题:哪种算法复杂度高时间复杂度怎么算常见算法有哪些 https://juejin.cn/post/6873379647125553159
8.《光谱学与光谱分析》2022年,第42卷,第02期然后,为验证PLS建立的TOC模型对仪器状态变化的鲁棒性,选择不同时间段采集的光谱数据分别作为训练集和测试集,进行不同仪器状态交叉实验,4组实验中测试集样品TOC浓度预测值的MAPE分别为3.82%,3.75%,3.43%和0.98%。实验表明,采用PLS算法建立的TOC紫外-可见光谱定量分析模型具有较好的分析精度和鲁棒性,分组实验和不同仪器http://www.sinospectroscopy.org.cn/readnews.php?nid=97028
9.Python3实现旋转数组的3种算法小结python旋转数组是一种常见的数据结构问题,通常是指一个有序数组经过旋转后,使得所有元素逆序排列。例如,给定一个数组 [4,5,6,7,0,1,2],它可能经过旋转变为 [0,1,2,4,5,6,7]。解决旋转数组的问题对于理解算法设计和数据结构有重要意义。 二、线性时间复杂度算法 https://www.jb51.net/python/30995639p.htm
10.Matlab自带遗传算法工具箱的介绍和使用注意事项4、selection(selection function)依据适应值选择父代 stochastic uniform:随机均匀分布 remainder: 残余,取适应值的整数部分进行轮盘赌选择 uniform:不是一个好方法,但是可以用来做测试 shift linear:线性转换 roulette:轮盘赌算法 tournament:联赛选择算法 custom:自定义 https://www.360doc.cn/article/42278386_747158977.html
11.五大算法设计思想,你都知道吗?腾讯云开发者社区7)线性时间选择 8)最接近点对问题 9)循环赛日程表 10)汉诺塔 二.动态规划 1.概念:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 2.思想策略:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前https://cloud.tencent.com/developer/article/1882027
12.机器学习的常用算法在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporal difference learning) http://jsjx.llu.edu.cn/info/1598/3841.htm
13.C++实现第K顺序统计量的求解方法一种原始的解决方案是,用堆排序或归并排序将输入数据进行排序,然后返回第k个元素。这样在Θ(nlgn)时间内一定可以解决。但是我们希望有更好的方案,最好是线性时间。 二、期望线性时间的解决方案: 为了在线性时间内解决这个选择问题,我们使用一个随机的分治算法,即RANDOMIZED-SELECT算法。此算法是使用随机化的快速排序https://www.xiuzhanwang.com/a1/Cyuyan/3500.html