思路:
1、以第一个数作为初始计算值X,将分区划分成 小于X 和 大于X 两部分 A1,A2
2、如果 A1.count + 1 正好是k,说明,第k小的数正是这个将分区恰好划分成[min,k-1] [k+1,max]的数。
3、如果 A1.count + 1 小于k,说明我们要找的k在A2中存在,那么对A2再次进行循环划分。
如果 A1.count + 1 大于k,说明我们要找的k在A1中存在,那么对A1再次进行循环划分。
4、以新的目的分区A1 or A2重复操作,以第一个数作为新的x,将分区划分成……(形成第二轮循环)
核心思想就是每轮得到的结果都是第mid小 直到k=mid
注意
注意filter本身是transformation,需要cache,否则之后的循环将访问的仍然是第一次A1,A2
代码
# Linear-time selection
#找出第K小的数字
#每轮得到的结果都是第mid小 直到k=mid
data = [34, 67, 21, 56, 47, 89, 12, 44, 74, 43, 26]
A = sc.parallelize(data,2)
k = 4
while True:
x = A.first()
A1 = A.filter(lambda z: z < x)# filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f
#和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件
#使用一个布尔函数为RD