随机选择算法如下:
输入:一个数组,其中包含(为简单起见,是不同的)数字和一个Ñ ķ ∈ [ Ñ ]
输出:该“等级的元素”(即,一个在位置如果进行了排序)甲ķ 甲
方法:
- 如果有一个元素,则将其返回
- 随机均匀地选择一个元素(“枢轴”)
- 计算集合和- [R = { 一个∈ 甲:一> p }
- 如果,返回的等级元素。ķ 大号
- 否则,返回等级元素[R
我被问到以下问题:
假设,那么您正在寻找中位数,并将 设为常数。在第一次递归调用中,包含中位数的集合的大小最大为的概率是多少?α ∈ (1 / 2 ,1 )α Ñ
有人告诉我答案是,理由是“所选的枢轴应介于和乘以原始数组之间”
为什么?作为,无论选择哪个元素作为枢轴,都大于或小于原始元素的一半以上。中位数始终位于较大的子数组中,因为分区的子数组中的元素始终小于枢轴。
如果支点位于原始数组的前半部分(少于一半)中,则中位数肯定会在后半部分中,因为一旦找到中位数,它就必须位于数组的中间位置,并且如上所述,枢轴之前的所有内容都较小。
如果枢轴位于原始数组的后半部分(元素的一半以上),则中位数肯定会在较大的前半部分,出于相同的原因,枢轴之前的所有内容都被认为较小。
例:
3 4 5 8 7 9 2 1 6 10
中位数是5。
假设所选的枢轴为2,因此在第一次迭代后,它变为:
1 2 ....更大的部分....
在第一次迭代后仅1
和2
被交换。数字5(中位数)仍在前半部分(根据枢轴2)。关键是,中位数始终位于较大的一半,它如何有机会停留在较小的子数组中?