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个数。

线性查找算法(BFPRT)相关推荐

  1. 算法与数据结构基础<一>----线性查找法

    开篇: 对于数据结构及算法的学习在17年时就已经在博客中开了专栏: 但是!!!感觉学得有点零散,有c版本的,也有java版本的,没成体系,当然其效果也并没达到自己满意的效果,基于此,这里准备重新开个专 ...

  2. 查找算法(顺序查找、二分法查找、二叉树查找、hash查找)

    查找功能是数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1)顺 ...

  3. 数据结构与算法---查找算法(Search Algorithm)

    查找算法介绍 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1)线性查找算法 示例: 有一个数列: {1,8, 10, 89, 1000, 123 ...

  4. 第 8 章 查找算法

    第 8 章 查找算法 1.查找算法介绍 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 2.线性查找 编写线性查找算法代码 public class SeqSearch {public ...

  5. 20172328 蓝墨云实验——三种查找算法练习

    20172328 蓝墨云实验--三种查找算法练习 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:2018年10月1 ...

  6. 数据结构与算法【Java】06---七大查找算法总结

    文章目录 数据结构与算法[Java]06---查找算法总结 1.查找算法简介 1.1.查找的定义 1.2.查找算法分类 1.3.常用查找算法 2.线性查找算法 2.1.线性查找简介 2.2.线性查找代 ...

  7. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  8. 算法与数据结构(第一周)——线性查找法

    目录 线性查找法介绍 实现线性查找法 使用泛型 使用自定义类测试算法 循环不变量 简单的复杂度分析 常见的时间复杂度 测试算法性能 线性查找法介绍 线性查找法是一个非常简单的算法,比如说现在有一打试卷 ...

  9. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  10. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

最新文章

  1. 智源博士后合作导师专访 | 曾毅:面向可持续发展的人工智能
  2. 007_Vue style样式绑定
  3. ios label文字行间距_iOS- 设置label的行间距字体间距
  4. 【转】Java 8十个lambda表达式案例
  5. LwIP 协议栈源码详解 ——TCP/IP 协议的实现(二:移植综述)
  6. webstorm汉化之后出现乱码现象
  7. 忙碌了一整天,终于弄好了免费电脑版的KTV点歌系统,以后可以K歌了!
  8. PSpice瞬态分析、交流分析和灵敏度分析
  9. PKI加密体系加密过程及原理
  10. 教你快速制作多张图片、多段视频的画中画特效
  11. 不同手指戴戒指时的清热解毒的清是什么意思?_百度知道
  12. 如何将amr文件转成mp3格式?
  13. 选对了裤长,胜过任何一件高级定制
  14. HTML期末大作业课程设计~仿阴阳师游戏官网首页html模板(HTML+CSS)~动漫主题html5网页模板-HTML期末作业课程设计期末大作业动漫主题html5网页模板-html5网页设计源码...
  15. 卖高价的洋水果是个好榜样
  16. 生产进度管理系统为制造管理提供较完善的解决方案
  17. MAC Nginx配置: open() “xxx/logs/error.log“ failed (2: No such file or direc
  18. 三分钟了解http和https
  19. 【数据挖掘】葡萄酒质量分析及异常值检测
  20. Altium Designer 导出原理图库SCHLIB 成 ORCAD的OLB

热门文章

  1. POJ 1236 Network of Schools (校园网)
  2. ActiveReports 9 新功能:创新的报表分层设计理念
  3. Winform 类似于WINDOWS的选择文件夹对话框
  4. 入门排序(冒泡、选择、直接)
  5. $.ajax方法success方法窗口弹不出
  6. 9.1.4 前端 - HTML body标签 - 标题,段落,分割线,换行,特殊符号,列表,超链接,图片,div/span,表格,表单,input标签,多行文本,单选/多选,下拉,按钮...
  7. java 多线程 28 : 多线程组件之 Semaphore 信号量
  8. 【转】使用spring @Scheduled注解执行定时任务
  9. 案例研究–亚马逊服务中断,数据库崩溃–我们恢复数据库且无数据损失
  10. Java开发笔记(一百三十二)Swing的表格