顺序统计量和中位数
---雨竹清风
顺序统计量:第i个顺序统计量是指该集合中第i个小的元素。
最小值是第一个顺序统计量,而最大值时第n个顺序统计量。
中位数:是有序集合中中间元素,当元素的个数是奇数时则其中位数是?(n+1)/2?;当元素的个数是偶数时则其中位数是(n+1)/2。
怎么得到最大值和最小值?
当我们独立的找出最大值和最小值,假设一共n个数,则要想找到最大值和最小值,需要与剩余的n-1个元素一一比较,那么就需要比较n-1个元素,即比较n-1次。最大值和最小值那就需要2(n-1)次比较。
而我们不想要这么多次数才能找出最大值与最小值,所以我们需要将其改进,对这组数同时寻找最大值和最小值。
若该组元素的个数为偶数个,那么我们一对一对的进行比较。即先比较前两个元素,大者赋给最大值,小者赋给最小值;然后再取一对元素进行比较,大者与最大值相比较,若比最大值大则修改最大值;小者与最小值相比较,若比最小值还小则修改最小值。这样我们比较下来一共需要3((n-2)/2) + 1次比较即可。因为我们首先进行了一次比较,然后一对一对的比较一共(n-2)/2对元素,每一对需要比较3次,所以后面的(n - 2)/2对元素一共做了3(n - 2)/2。所以一共做了3((n-2)/2) + 1=(3n/2) - 2次比较。
若元素的个数是奇数个,那么我们先取一个数作为最大值和最小值,然后取一对进行比较,直到结束为止。若是奇数个元素,一共需要3(n - 2)/2次比较。
例子:从集合1,6,8,9,5,11中找出最大值和最小值
1)首先取出前2个元素1和6进行比较,大者赋值为最大值,小者赋给最小值。
1 | 6 | 8 | 9 | 5 | 11 |
Max = 6,Min = 1
2)取下一对元素先进行比较,大的与最大值进行比较,小的与最小值比较。
1 | 6 | 8 | 9 | 5 | 11 |
9 > 8则9 与Max = 6比较,9 > 6则修改最大值,Max = 9;
8与Min = 1进行比较,8 > 1所以不用修改。
3)取下一对元素先进行比较,大的与最大值进行比较,小的与最小值比较。
1 | 6 | 8 | 9 | 5 | 11 |
11 > 5则11 与Max = 9比较,11 > 9则修改最大值,Max = 11;
5与Min = 1进行比较,5 > 1所以不用修改。
经过3次就将最大值和最小值都求出来了。
怎么求顺序统计量呐?
本文介绍的是select算法。
算法描述:
1) 将输入的元素的集合每5个元素划分成一组,一共划分成?n/5?组。
2) 找出每组中的中位数,然后再找中位数的中位数x。
3) 用中位数的中位数x做主元,做一次划分(快排)。
4) 确定x所在的位置k(从1开始),找第i个顺序统计量,若i < k,则从左半区找第i小元素;若i > k则从右半区找第i-k小元素,这是一个不断递归的过程。
例子:
给定集合5,13,90,95,98,86,40,80,74,24,43,77,38,找第6顺序统计量。
1) 划分组
5,13,90,95,98 86,40,80,74,24 43,77,38
2) 找中位数的中位数
5,13,90,95,98 86,40,80,74,24 43,74,38
中位数的中位数43
3) 用中位数43做主元做一次划分
结果为:
5,13,40,24,38,43,90,80,95,74,77,98,86
4) 找第6顺序统计量
43是在6号位置,所以是第6顺序统计量。若找的是第8顺序统计量,则从右半区去递归的寻找第8顺序统计量。