中位数和顺序统计量

Posted 秋风Haut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中位数和顺序统计量相关的知识,希望对你有一定的参考价值。

在一个由n个元素组成的集合中,第i个顺序统计量,是该集合中第i小的元素。

9.1讨论了数组的最小值和最大值。
如果要找出数组的最小值,可以通过至多n-1次比较得出。最大值相同。
但若要求同时找出最大值和最小值呢?可以采用9.1介绍的方法。

就是不是将元素与最小值或最大值相比,而是将数组的元素成对处理,先将两个元素相比,然后将较大的与当前的最大值比较,将较小的元素与当前的最小值相比较。这样每2个元素就只需要3次比较。
总的比较次数,如果n是偶数,需3 * (n-2)/2次比较。
若n为奇数,则将最大值和最小值的初始化都设定为第一个元素。则需3 * (n-1)/2次比较。

关于期望时间为线性时间,最坏时间为O(n^2) 的选择算法,书中给出了非常严谨的说明与证明。

这里不再赘述。
我得到的启发是:
从快速排序。到期望时间为线性时间的选择算法。主要是抽取出了partition操作,然后通过partition将数组分为大于pivot和小于pivot两个部分,来确定次序关系。每次舍弃一部分,将查找范围缩小。缩小操作范围的算法操作,我现在所了解的还有二分法。而希尔排序事实上是改进的插入排序。堆排序可惜看到一些希尔排序的影子,也有选择排序的相似的操作。 如果将算法拆分来看的话,其实是一步一步的操作,每一步的操作都有其思想蕴含其中。

具体算法来说,不同的排序算法,是不同的排序方法,冒泡排序,就是最基础的排序玩法,依次将数组中的最大值,第2大值,第3大值。。。找出来,就完成了排序。接着是插入排序,类比平时打纸牌,将数组分成已排序,未排序和正在排序三部分。将正在排序的插入到已排序的部分中。其实,除了希尔排序的优化方式以外,也可以针对插入操作,对插入排序进行优化。就是将原来的每次新元素,都要进行O(n)次比较,变为使用二分查找来找到新元素该在的位置,将此步骤的时间缩短为O(lgn)也是一种优化方法。

这是最基础的排序解法。
还有方法是,我们可以将已经排好序的两个数组合并成一个数组,合并成的新数组,也是有序的。这就是归并排序。
还有,既然插入排序,每次新元素向前移动一个元素太慢,我们可以让他前移的步伐加大,这就是希尔排序、二分插入排序。
或者,我们不采用那样确定的方法,每次只确定把数组分成是两个部分,只确定前半部分的元素必小于后半部分的元素,但部分内的元素不一定有序。这样持续划分下去,数组终将成为2个元素的小数组,前半部分和后半部分各含有一个元素,再向上递归返回,同样也将数组排好了序。

以上这些算法,经证明,时间复杂度的上限是O(nlgn),那么有没有可能突破这个上限呢??思考思考思考、发现这些算法都有一个共同特点就是需要对元素进行无数次比较来确定次序。如果使用书中的决策树的方法证明的话,可以很直观的证明比较排序的时间上限就是O(nlgn),因此,若要突破该上限,就必须要去掉,比较这一步骤。

找灵感时,就会发现排序都是基于数字的,再从数字角度考虑的话,就很容易考虑到桶排序和计数排序。这是后话。

以上这些算法有没有一些共同点呢?可以发现,伴随着算法时间的改善,我们利用了越来越多的数组中元素的特性,比如,刚开始时,冒泡排序是不管数组元素是怎样的,我只管一个一个找出要找的元素就可以了。插入排序也是如此。再提升一个复杂度级别的算法,则在此基础上,给了数组元素很多假定,假如数组是两个已排好序的部分会怎样?假如数组一部分必小于另一部分,会怎样?再提升时间性能的算法,就再次假定,我们只管数组元素全是数字的情况,既然是数字,就可以为所欲为了。我们可以按照个、十、百、千。。。一位一位的进行比较(桶排序)。我们也可以计算下小于该元素的有几个元素(计数排序)等等。也就是说,我们想要更加精确的获得想要的信息,就必须增加我们的输入信息。这个结论是最近看机器学习的算法时,看到信息熵的概念。想到的。

再接下来,我们将此思想进行一些应用。
如果要获取数组中第i大的元素,若是寻常方法,就要进行比较操作。但这样必然会导致O(nlgn)的运行时间。而且本要求第i大的元素,把整个数组都排序了,有点费力不讨好的嫌疑。有没有更好的算法呢?
这时想起,增加我们的输入。我们可以假定一些数组的基本情况。比如数组没有排好序,但是至少有一部分与另一部分的大小情况可以掌握。这不就想到了快速排序的partition了吗?这就是本章中的期望时间为线性时间的选择算法了。证明略。那么还有没有更快的算法呢?对,我们再输入信息,比如,我们已经找到了数组的中位数。这样也是可以确定第i大的元素在哪一半了。再详细扩展一下,便是本章中第3节,最坏时间为线性时间的选择算法。

若要问,该算法,还有没有更好的方案?我说,有。一定有。只要我们可以再对输入元素进行假定。比如,我们确定了数组中的第i-1大的元素。对此思想方向延伸,必然可以继续对第三节的算法进行优化。

以上是关于中位数和顺序统计量的主要内容,如果未能解决你的问题,请参考以下文章

中位数和顺序统计量

中位数和顺序统计量

算法导论习题—排序最坏情况线性时间选择算法小顺序统计量

算法导论

数据挖掘——统计学分析(五:统计量)

ML_简单线性回归