中位数算法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中位数算法?相关的知识,希望对你有一定的参考价值。
楼上才是白痴,自己什么也不懂不要说的别人也是什么也不懂。就是因为有了你们这种人,世界多花了巨额的代价来多做不必要的工作。
很明显楼主不是你这样的。
实数的排序算法复杂度是o(nlogn),这个中位数可以做到o(n)
下面我来说明这个算法的过程。
算法是基于归并排序(merge-sort)的更改。
把中位数更改为等价的叙述。无序的n个数中的第int(n/2)大的元素。(k=int(n/2))
1.随机化数据,这样可以保证因为输出时候的对称性(可能的顺序输入)而造成的算法退化。
for
(int
i=number.count;i>=0;i--)
swap(number[i],number[random(0,i-1)]);//swap,交换,random,0,k闭区间的随机数。
2.归并排序主过程。
mergesort(a,b,k)//寻找number数组中从下标a到下标b的元素中的第k大的元素。
t=number[a];
把这a,b中的元素从排,使a~p-1的元素比t小,p+1~b的元素比t大。number[p]=t;//o(n),这步你构造吧。不是很困难,伪代码不写太多。
//此时比t小元素有p-1-a+1=p-a个,
//分情况,如果k=p-a+1,返回t
//如果k>p-a+1,返回mergesort(p+1,b,k-(p-a+1))
//如果k
评论
0
0
0
加载更多 参考技术A 中位数嘛,顾名思义是位置处于中间的那个数,偶数取中间两个数的平均值,奇数就是最中间的数,本题答案是5.5
中位数算法的中位数解释
【中文标题】中位数算法的中位数解释【英文标题】:Explanation of the Median of Medians algorithm 【发布时间】:2012-09-14 18:39:22 【问题描述】:Median of medians
方法在quicksort
类型的分区算法中非常流行,以产生相当好的枢轴,这样它就可以均匀地对数组进行分区。其逻辑在***中给出为:
所选的枢轴小于和大于中位数列表中元素的一半,每半数大约是 n/10 个元素 (1/2 * (n/5))。这些元素中的每一个都是 5 的中位数,使其小于块外的 2 个其他元素和大于 2 个其他元素。因此,主元小于块外的 3(n/10) 个元素,大于块外的另外 3(n/10) 个元素。因此,选择的中位数将元素拆分为 30%/70% 和 70%/30% 之间的某个位置,这确保了算法在最坏情况下的线性行为。
谁能给我解释清楚一点。我发现很难理解其中的逻辑。
【问题讨论】:
【参考方案1】:想想以下一组数字:
5 2 6 3 1
这些数字的中位数是3
。现在如果你有一个数字n
,如果n > 3
,那么它至少比上面的数字大一半。如果n < 3
,则至少小于上述数字的一半。
这就是想法。也就是说,对于每组 5 个数字,你得到他们的中位数。现在你有n / 5
号码。这很明显。
现在,如果您得到这些数字的中位数(称为m
),它会大于其中一半,小于另一半(根据中位数的定义!)。换句话说,m
大于 n / 10
数字(它们本身是 5 个小元素组的中位数)并且大于另一个 n / 10
数字(同样是 5 个小元素组的中位数)。
在上面的例子中,我们看到如果中位数是k
而你有m > k
,那么m
也大于其他两个数字(它们本身小于k
)。这意味着对于m
大于其中值的那些较小的 5 个元素组中的每一个,m
也大于其他两个数字。这使得在每个n / 10
小的 5 个元素组中至少有 3 个数字(2 个数字 + 中位数本身),它们小于 m
。因此,m
至少大于 3n/10
数字。
元素个数m
大于类似的逻辑。
【讨论】:
再问一个问题,这个方法怎么保证这个数字是中位数呢?中位数是将数组划分为上半部分和下半部分的数字。那么这个 30-30-70 的数字意味着什么? 嗯,中位数在中间,但是m
(在上面的文字中)并不是所有数字的中位数。它只是 1/5 数字的中位数(它们本身就是较小的 5 个元素组的中位数)。试着用更多的注意力阅读最后一段。最后,得出的结论是m
至少大于数字中的3n/10
,也就是说m
大于至少30% 的数字。所以最后,它就像m
至少大于 30% 并且小于至少另外 30%。还有 40% 我们不确定。
那么它为什么平均给出 50-50 个分区? 50-50分区是由正常中位数给出的,对吧?
它平均不给50-50
分区。它总是在30-70
和70-30
之间给出某个值(也许你可以平均称之为50-50
?),但这不是重点。为了让快速排序给O(nlogn)
时间复杂度,它需要能够将数组划分为与数组大小成比例的分区。这就是logn
递归深度的原因。 30-70
除法已经给出了与n
成比例的3n/10
和7n/10
除法。所以即使它不是一个完美的50-50
,它仍然会产生对数递归深度(除了它不是基数为2的log
,而是基数10/7
)以上是关于中位数算法?的主要内容,如果未能解决你的问题,请参考以下文章