算法13-BFPRT算法

news2025/3/14 15:06:25

一、BFPRT 算法概念

BFPRT 算法(Blum-Floyd-Pratt-Rivest-Tarjan 算法)是一种用于在无序数组中快速找到第 k 小(或第 k 大)元素的高效算法。它的时间复杂度为 O(n),在最坏情况下也能保证线性时间复杂度。BFPRT 算法的核心思想是通过巧妙的分组和中位数选择,减少问题的规模,从而快速找到目标元素。


二、BFPRT 算法的核心思想

  1. 分组

    • 将数组划分为若干个大小为 5 的小组(最后一个小组可能不足 5 个元素)。
  2. 找中位数的中位数

    • 对每个小组进行排序,找到每个小组的中位数。
    • 递归调用 BFPRT 算法,找到这些中位数的中位数(Median of Medians)。
  3. 划分数组

    • 使用中位数的中位数作为划分点,将数组划分为三部分:
      • 小于划分点的元素。
      • 等于划分点的元素。
      • 大于划分点的元素。
  4. 递归查找

    • 根据目标元素的位置,决定在哪个部分继续递归查找。

三、BFPRT 算法的流程图

以下是 BFPRT 算法的流程图,使用 Mermaid 语法绘制:

在小于 pivot 的部分
在等于 pivot 的部分
在大于 pivot 的部分
开始
将数组划分为大小为 5 的小组
对每个小组排序并找到中位数
递归找到中位数的中位数 pivot
使用 pivot 划分数组
目标元素的位置?
递归查找左部分
返回 pivot
递归查找右部分
结束

四、BFPRT 算法的示例代码

以下是 BFPRT 算法的 Python 实现代码:

def bfprt(arr, k):
    if len(arr) <= 5:  # 如果数组长度小于等于 5,直接排序并返回第 k 个元素
        return sorted(arr)[k - 1]
    
    # 将数组划分为大小为 5 的小组
    groups = [arr[i:i + 5] for i in range(0, len(arr), 5)]
    
    # 找到每个小组的中位数
    medians = [sorted(group)[len(group) // 2] for group in groups]
    
    # 递归找到中位数的中位数 pivot
    pivot = bfprt(medians, len(medians) // 2 + 1)
    
    # 使用 pivot 划分数组
    left = [x for x in arr if x < pivot]
    mid = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    
    # 根据目标元素的位置决定递归查找的部分
    if k <= len(left):
        return bfprt(left, k)
    elif k <= len(left) + len(mid):
        return pivot
    else:
        return bfprt(right, k - len(left) - len(mid))

# 示例
arr = [3, 2, 1, 5, 4, 7, 6, 8, 9]
k = 5
result = bfprt(arr, k)
print(f"第 {k} 小的元素是: {result}")  # 输出: 第 5 小的元素是: 5

五、代码详解

  1. 分组

    • 将数组划分为大小为 5 的小组。
  2. 找中位数的中位数

    • 对每个小组排序并找到中位数。
    • 递归调用 BFPRT 算法,找到这些中位数的中位数 pivot
  3. 划分数组

    • 使用 pivot 将数组划分为三部分:left(小于 pivot)、mid(等于 pivot)、right(大于 pivot)。
  4. 递归查找

    • 根据目标元素的位置,决定在 leftmidright 中继续递归查找。
  5. 示例运行

    • 在数组 [3, 2, 1, 5, 4, 7, 6, 8, 9] 中查找第 5 小的元素,返回 5

六、BFPRT 算法的应用场景

  1. 查找第 k 小(或第 k 大)元素

    • 在无序数组中快速找到第 k 小(或第 k 大)元素。
  2. 优化快速排序

    • 在快速排序中选择更好的划分点,避免最坏情况。
  3. 统计学问题

    • 在统计学中用于计算中位数或其他分位数。

七、BFPRT 算法的优势

  1. 时间复杂度低

    • BFPRT 算法的时间复杂度为 O(n),在最坏情况下也能保证线性时间复杂度。
  2. 稳定性高

    • 通过选择中位数的中位数作为划分点,BFPRT 算法能够有效避免最坏情况。
  3. 适用性广

    • 适用于无序数组中的查找问题,尤其适合大规模数据。

八、BFPRT 算法的注意事项

  1. 实现复杂度

    • BFPRT 算法的实现相对复杂,需要仔细处理分组和中位数选择。
  2. 空间复杂度

    • BFPRT 算法的空间复杂度为 O(n),需要额外的空间存储分组和中位数。
  3. 常数因子较大

    • 虽然时间复杂度为 O(n),但常数因子较大,实际运行时间可能较长。

九、总结

BFPRT 算法是一种高效的查找算法,能够在无序数组中快速找到第 k 小(或第 k 大)元素。通过巧妙的分组和中位数选择,BFPRT 算法在最坏情况下也能保证线性时间复杂度。掌握 BFPRT 算法的核心思想和实现方法,能够帮助你更好地解决实际问题。


© 著作权归作者所有

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android studio下载安装汉化-Flutter安装

1、下载android studio官方地址&#xff1a;&#xff08;这个网址可能直接打不开&#xff0c;需要VPN&#xff09; https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本&#xff0c;电脑显示芯片是Inter的就是x86的&#xff0c;显示m1和m2的就是arm的 …

Seaweedfs(master volume filer) docker run参数帮助文档

文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下&#xff0c;这个-volume.minFreeSpace string有点狠&#xff0c;比如设置值为10&#xff08;10%&#xff09;&#xff0c;它直接给系统只留下10%的空间&#xff0…

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…

【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

每日十题八股-补充材料-2025年2月15日

1.TCP是如何保证消息的顺序和可靠的&#xff1f; 写得超级好的文章 首先肯定是三次握手和四次挥手保证里通讯双方建立了正确有效的连接。 其次是校验和、序列号&#xff0c;ACK消息应答机制还有重传机制&#xff0c;保证了消息顺序和可靠。 同时配合拥塞机制和流量控制机制&am…

国内已经部署DeepSeek的第三方推荐

大家好&#xff0c;我是苍何。 最近DeepSeek爆火&#xff0c;我也说点心里话&#xff0c;其实就我们普通人而言&#xff0c;要想用好 DeepSeek&#xff0c;其实无非就是要利用好工具为我们自己提效。 比如你是搞编程的&#xff0c;你就得学会如何用 DeepSeek 更快速的辅助你编…

Windows环境下使用Ollama搭建本地AI大模型教程

注&#xff1a;Ollama仅支持Windows10及以上版本。 安装Ollama 去 ollama官网 下载对应平台及OS的安装包。 运行安装包&#xff0c;点击“安装”按钮即可开始安装。Ollama会自动安装到你的 C:\Users\<当前用户名>\AppData\Local\Programs\Ollama 目录上。 安装完成后&…

2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现&#xff1a; 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…

算法19(力扣244)反转字符串

1、问题 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 2、示例 &#xff08;1&#xff09; 示例 1&a…

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

ESP32 arduino + DeepSeek API访问

此项目主要使用ESP32-S3实现一个AI语音聊天助手&#xff0c;可以通过该项目熟悉ESP32-S3 arduino的开发&#xff0c;百度语音识别&#xff0c;语音合成API调用&#xff0c;百度文心一言大模型API的调用方法&#xff0c;音频的录制及播放&#xff0c;SD卡的读写&#xff0c;Wifi…

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…

SQLMesh 系列教程4- 详解模型特点及模型类型

SQLMesh 作为一款强大的数据建模工具&#xff0c;以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型&#xff0c;帮助读者快速了解其强大功能。我们将深入探讨不同模型类型&#xff08;如增量模型、全量模型、SCD Type 2 等&#xff0…

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak语言开发的集成化网络安全单兵工具&#xff0c;旨在覆盖渗透测试全流程&#xff0c;提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…

jenkins 配置ssh拉取gitlab

一、生成key ssh-keygen -t rsa -b 4096 -C "root" 二、将id_rsa内容拷贝到jenkins 公钥id_rsa.pub拷贝到gitlab

基于css实现正六边形的三种方案

方案一&#xff1a;通过旋转三个长方形生成正六边形 分析&#xff1a; 如下图所示&#xff0c;我们可以通过旋转三个长方形来得到一个正六边形。疑问&#xff1a; 1. 长方形的宽高分别是多少&#xff1f; 设正六边形的边长是100&#xff0c;基于一些数学常识&#xff0c;可以…

18.Python实战:实现年会抽奖系统

目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…

145,【5】 buuctf web [GWCTF 2019]mypassword

进入靶场 修改了url后才到了注册页面 注测后再登录 查看源码 都点进去看看 有个反馈页面 再查看源码 又有收获 // 检查$feedback是否为数组 if (is_array($feedback)) {// 如果是数组&#xff0c;弹出提示框提示反馈不合法echo "<script>alert(反馈不合法);<…

19.4.9 数据库方式操作Excel

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本节所说的操作Excel操作是讲如何把Excel作为数据库来操作。 通过COM来操作Excel操作&#xff0c;请参看第21.2节 在第19.3.4节【…