bfprt算法原理和复杂度估算

本文介绍了BFPRT算法,一种寻找无序数组中第k小元素的平均复杂度为O(n)的方法。该算法通过分组、组内排序、寻找中位数等步骤,避免了传统快速排序的最坏情况。同时,文章提供了Java和C++的实现代码示例。

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

在文章开头先了解随机快速排序,随机排序之前博文中有,在此增加快速排序中partition函数,参照http://www.cnblogs.com/sdlwlxf/p/5131793.html


Master公式:用于算复杂度


此公式只适用于每次递归量相同的情况,可以简化理解为一下过程:

a表示递归的次数,b表示递归规程中每次递归缩小是的数据量,n^d为递归后续行为的复杂度。比如,数据量为n,归并排序时复杂度=前n/2的复杂度+后n/2的复杂度+将这两个n/2合并成一个数组时的复杂度。


bfprt算法原理:

在无序数组中,找到最小或最大第k个数的算法思想:

在快速排序或是随机快速排序中,步骤为:1、用速排序或是随机快速排序方法找X      2、partition函数把数组排成 >x  ==x  <x  3、看==x的下标分为是否包含k

若在即可得到第k个数,若不在,则在>x  或<x  中步骤1 开始重新查找,直至找到。此方法的平均复杂度为O(n),但单次复杂度不一定是。


bfprt算法只是在选择划分值的策略上不一样,其他的与快排一样。

bfprt算法的划分策略是:1、将数组每五个划为一组,不够5个单列一组     复杂度O(1)

                                            2、每个组中的数据进行组内排序         复杂度O(n)

                                            3、把每个组中的中位数拿出,组成一个新的数组   n/5    复杂度O(n)

                                            4、求出n/5这个数组的中位数,这个数在数组中是第n/10个数,用重复调用自己的方法来找。此处的中位数就是所要找的划分值 F(n/5)

                                            5、partition函数把数组排成 >x  ==x  <x    复杂度O(n)

                                            6、看==x的下标分为是否包含k若在即可得到第k个数,若不在,则在>x  或<x  中步骤1 开始重新查找,直至找到。


假设五组已经排好的序列,X出为最后找的中位数,在数组的n/10的位置上。<=这个值的有n*3/10,>这个值的为n*7/10

整个复杂度:F(n)=F(n/5)+F(n*7/5)+O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值