RDD用法与实例(六):Linear-time selection 线性时间选择找出第K小的数字

该博客介绍了如何使用Spark的RDD实现线性时间选择算法,找出数据集中的第K小的数字。通过不断将数据分区,比较分区大小并调整搜索范围,最终达到在大数据集上高效查找目标值的目的。注意在使用filter操作时需配合cache以避免重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值