博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性查找算法(BFPRT)
阅读量:6953 次
发布时间:2019-06-27

本文共 1555 字,大约阅读时间需要 5 分钟。

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

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

步骤

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

 终止条件:n=1 时,返回的即是i小元素

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

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

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

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

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

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

 

转载地址:http://gtjil.baihongyu.com/

你可能感兴趣的文章
Flutter 入门之 ListTile 使用指南
查看>>
Android Material Design控件使用(一)——ConstraintLayout 约束布局
查看>>
为什么区块链世界既需要计算机科学家也需要经济学家?
查看>>
Atom 微信小程序文件代码高亮
查看>>
Qtum量子链周报(3月18日-3月24日)
查看>>
couchbase介绍与实践(一)
查看>>
JavaScript正则表达式(2)
查看>>
开源 | Rainbond 3.5 pre-release
查看>>
css中px、em、rem区别与使用
查看>>
两个男同事打架 公司决定要不离职, 要不手牵手一下午, 结果他俩就选择.........
查看>>
(三)java版spring cloud+spring boot 社交电子商务平台 - Spring Cloud集成项目简介
查看>>
本地搭建ios测试包上传下载安装环境(类似蒲公英)
查看>>
BCH大区块导致中心化其实是伪命题
查看>>
Linux软件包管理之源码安装
查看>>
求两个数的最大公约数两种方法
查看>>
结对编程讲义-PPT
查看>>
SOLR
查看>>
配置Nutch模拟浏览器以绕过反爬虫限制
查看>>
小牛电动的软文列表,和实际用户的反馈实在是天上地下。。
查看>>
list()详解
查看>>