BFPRT(线性查找算法) 笔记

目录

步骤

BFPRT算法的作者是5位真正的大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan)。

BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。

回到顶部
步骤
将n个元素每 5 个一组,分成n/5(上界)组。
取出每一组的中位数,任意排序方法,比如插入排序。
递归的调用 selection 算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。
若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k 小的元素。
 终止条件:n=1 时,返回的即是i小元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

待查找的数组 :
4 1 2 56 24 5 6 97 8 0 4 8 6 2 3 6 1 9 3 4 6 2
找出第 8 小的数
被分割的数组 :
4 1 2 56 24
该数组的中位数 : 4
被分割的数组 :
5 6 97 8 0
该数组的中位数 : 6
被分割的数组 :
4 8 6 2 3
该数组的中位数 : 4
被分割的数组 :
6 1 9 3 4
该数组的中位数 : 4
中位数的集合 :
4 6 4 4
经过选择排序后的中位数数组 :
4 4 4 6
定义的 x 为 : 4

待查找的数组 :
4 1 2 0 4 2 3 1 3 4 2
找出第 8 小的数 //数组长度比8大
被分割的数组 :
4 1 2 0 4
该数组的中位数 : 2
被分割的数组 :
2 3 1 3 4
该数组的中位数 : 3
中位数的集合 :
2 3
经过选择排序后的中位数数组 :
2 3
定义的 x 为 : 2 //前6小的数据已得出(0 1 1 2 2 2)

待查找的数组 :
4 4 3 3 4
找出第 2 小的数 3 //(8-6=2 查出第二2小的数据)
第 8 小的数为 : 3
(0 1 1 2 2 2 3 3 4 4 4 5 6 6 6 6 8 8 9 24 56 97)
ps:

1.为何利用5作为元组大小,可能是与寄存器的数量和运算有关。

2.为何称为线性的解答:

划分时以5个元素为一组求取中位数,共得到n/5个中位数,再递归求取中位数,复杂度为T(n/5)。

得到的中位数x作为主元进行划分,在n/5个中位数中,主元x大于其中1/2n/5=n/10的中位数,而每个中位数在其本来的5个数的小组中又大于或等于其中的3个数,所以主元x至少大于所有数中的n/103=3/10n个。同理,主元x至少小于所有数中的3/10n个。即划分之后,任意一边的长度至少为3/10,在最坏情况下,每次选择都选到了7/10的那一部分,则递归的复杂度为T(7/10*n)。

在每5个数求中位数和划分的函数中,进行若干个次线性的扫描,其时间复杂度为c*n,其中c为常数。

其总的时间复杂度满足: T(n)<=T(n/5)+T(7/10n)+cn

假设T(n)=xn,其中x不一定是常数(比如x可以为n的倍数,则对应的T(n)=O(n^2))。则有 xn <= xn/5 + x7/10n + cn。得到 x<=10*c

于是可以知道x与n无关,T(n)<=10cn,为线性时间复杂度算法。

而这又是最坏情况下的分析,故BFPRT可以在最坏情况下以线性时间求得n个数中的第k个数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值