算法13-BFPRT算法
一、BFPRT 算法概念
BFPRT 算法(Blum-Floyd-Pratt-Rivest-Tarjan 算法)是一种用于在无序数组中快速找到第 k 小(或第 k 大)元素的高效算法。它的时间复杂度为 O(n),在最坏情况下也能保证线性时间复杂度。BFPRT 算法的核心思想是通过巧妙的分组和中位数选择,减少问题的规模,从而快速找到目标元素。
二、BFPRT 算法的核心思想
-
分组:
- 将数组划分为若干个大小为 5 的小组(最后一个小组可能不足 5 个元素)。
-
找中位数的中位数:
- 对每个小组进行排序,找到每个小组的中位数。
- 递归调用 BFPRT 算法,找到这些中位数的中位数(Median of Medians)。
-
划分数组:
- 使用中位数的中位数作为划分点,将数组划分为三部分:
- 小于划分点的元素。
- 等于划分点的元素。
- 大于划分点的元素。
- 使用中位数的中位数作为划分点,将数组划分为三部分:
-
递归查找:
- 根据目标元素的位置,决定在哪个部分继续递归查找。
三、BFPRT 算法的流程图
以下是 BFPRT 算法的流程图,使用 Mermaid 语法绘制:
四、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]# 递归找到中位数的中位数 pivotpivot = 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 pivotelse: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
五、代码详解
-
分组:
- 将数组划分为大小为 5 的小组。
-
找中位数的中位数:
- 对每个小组排序并找到中位数。
- 递归调用 BFPRT 算法,找到这些中位数的中位数
pivot。
-
划分数组:
- 使用
pivot将数组划分为三部分:left(小于pivot)、mid(等于pivot)、right(大于pivot)。
- 使用
-
递归查找:
- 根据目标元素的位置,决定在
left、mid或right中继续递归查找。
- 根据目标元素的位置,决定在
-
示例运行:
- 在数组
[3, 2, 1, 5, 4, 7, 6, 8, 9]中查找第 5 小的元素,返回5。
- 在数组
六、BFPRT 算法的应用场景
-
查找第 k 小(或第 k 大)元素:
- 在无序数组中快速找到第 k 小(或第 k 大)元素。
-
优化快速排序:
- 在快速排序中选择更好的划分点,避免最坏情况。
-
统计学问题:
- 在统计学中用于计算中位数或其他分位数。
七、BFPRT 算法的优势
-
时间复杂度低:
- BFPRT 算法的时间复杂度为 O(n),在最坏情况下也能保证线性时间复杂度。
-
稳定性高:
- 通过选择中位数的中位数作为划分点,BFPRT 算法能够有效避免最坏情况。
-
适用性广:
- 适用于无序数组中的查找问题,尤其适合大规模数据。
八、BFPRT 算法的注意事项
-
实现复杂度:
- BFPRT 算法的实现相对复杂,需要仔细处理分组和中位数选择。
-
空间复杂度:
- BFPRT 算法的空间复杂度为 O(n),需要额外的空间存储分组和中位数。
-
常数因子较大:
- 虽然时间复杂度为 O(n),但常数因子较大,实际运行时间可能较长。
九、总结
BFPRT 算法是一种高效的查找算法,能够在无序数组中快速找到第 k 小(或第 k 大)元素。通过巧妙的分组和中位数选择,BFPRT 算法在最坏情况下也能保证线性时间复杂度。掌握 BFPRT 算法的核心思想和实现方法,能够帮助你更好地解决实际问题。
© 著作权归作者所有
相关文章:
算法13-BFPRT算法
一、BFPRT 算法概念 BFPRT 算法(Blum-Floyd-Pratt-Rivest-Tarjan 算法)是一种用于在无序数组中快速找到第 k 小(或第 k 大)元素的高效算法。它的时间复杂度为 O(n),在最坏情况下也能保证线性时间复杂度。BFPRT 算法的…...
android studio下载安装汉化-Flutter安装
1、下载android studio官方地址:(这个网址可能直接打不开,需要VPN) https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本,电脑显示芯片是Inter的就是x86的,显示m1和m2的就是arm的 …...
Seaweedfs(master volume filer) docker run参数帮助文档
文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下,这个-volume.minFreeSpace string有点狠,比如设置值为10(10%),它直接给系统只留下10%的空间࿰…...
嵌套调用实现数组元素逆序存放
主函数调用reverse_array(int ptr[],int cnt)函数,该函数在调用inplace_swap(int *x,int *y)函数时,把两个不同的地址送给inplace_swap(int *x,int *y)函数,实现这两个位置处元素的交换。 令*xa,*yb 则*y *x^*y执行后,*xa,*ya^b…...
【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞
文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1:代码分析 4.2:流量分析 5.poc代码: 1.漏洞描述 漏洞编号:CVE-2022-35555 漏洞名称:Tenda W6 命令注入 威胁等级:高危 漏洞详情࿱…...
Spark 和 Flink
Spark 和 Flink 都是目前流行的大数据处理引擎,但它们在架构设计、应用场景、性能和生态方面有较大区别。以下是详细对比: 1. 架构与核心概念 方面Apache SparkApache Flink计算模型微批(Micro-Batch)为主,但支持结构…...
Jupyter lab 无法导出格式 Save and Export Notebook As无法展开
本来尝试jypyter lab如何导出HTML带有侧边导航栏,一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了,浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...
C#(Winform)通过添加AForge添加并使用系统摄像机
先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...
【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
每日十题八股-补充材料-2025年2月15日
1.TCP是如何保证消息的顺序和可靠的? 写得超级好的文章 首先肯定是三次握手和四次挥手保证里通讯双方建立了正确有效的连接。 其次是校验和、序列号,ACK消息应答机制还有重传机制,保证了消息顺序和可靠。 同时配合拥塞机制和流量控制机制&am…...
国内已经部署DeepSeek的第三方推荐
大家好,我是苍何。 最近DeepSeek爆火,我也说点心里话,其实就我们普通人而言,要想用好 DeepSeek,其实无非就是要利用好工具为我们自己提效。 比如你是搞编程的,你就得学会如何用 DeepSeek 更快速的辅助你编…...
理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口
在 WebGPU 开发中, GPUDevice 是一个至关重要的对象,它是与 GPU 进行交互的核心接口。通过 GPUDevice ,开发者可以创建和管理 GPU 资源(如缓冲区、纹理、管线等),并提交命令缓冲区以执行渲染和计算任…...
APlayer - APlayer 初识(APlayer 初识案例、APlayer 常用事件)
一、APlayer APlayer 是一款轻量级、功能丰富的 HTML5 音频播放器 二、APlayer 初识案例 1、案例演示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthde…...
c++中什么时候应该使用final关键字?
在C中,final关键字是自C11标准引入的重要特性,主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析,并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…...
2025年2月15日(虚拟环境-deepseek)
好的,用户之前已经询问过如何在树莓派上安装venv,现在他们的问题是“如何使用”。我需要回顾之前的对话,看看之前是否已经涵盖了使用的部分,或者用户需要更详细的使用步骤。 首先,查看之前的回答,发现用户…...
PyTorch Lightning LightningDataModule 介绍
LightningDataModule 是 PyTorch Lightning 提供的数据模块,用于统一管理数据加载流程(包括数据准备、预处理、拆分、批量加载等)。它的核心作用是将数据处理逻辑与模型解耦,提高代码的可复用性和可读性。 1. LightningDataModule 的作用 ✅ 封装数据预处理:数据下载、清…...
Windows环境下使用Ollama搭建本地AI大模型教程
注:Ollama仅支持Windows10及以上版本。 安装Ollama 去 ollama官网 下载对应平台及OS的安装包。 运行安装包,点击“安装”按钮即可开始安装。Ollama会自动安装到你的 C:\Users\<当前用户名>\AppData\Local\Programs\Ollama 目录上。 安装完成后&…...
2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现: 冬装最重要的作用是保暖,也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料,从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...
算法19(力扣244)反转字符串
1、问题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 2、示例 (1) 示例 1&a…...
DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
ESP32 arduino + DeepSeek API访问
此项目主要使用ESP32-S3实现一个AI语音聊天助手,可以通过该项目熟悉ESP32-S3 arduino的开发,百度语音识别,语音合成API调用,百度文心一言大模型API的调用方法,音频的录制及播放,SD卡的读写,Wifi…...
最新国内 ChatGPT Plus/Pro 获取教程
最后更新版本:20250202 教程介绍: 本文将详细介绍如何快速获取一张虚拟信用卡,并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号!一张虚拟信用卡…...
SQLMesh 系列教程4- 详解模型特点及模型类型
SQLMesh 作为一款强大的数据建模工具,以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型,帮助读者快速了解其强大功能。我们将深入探讨不同模型类型(如增量模型、全量模型、SCD Type 2 等࿰…...
三维重建(十二)——3D先验的使用
文章目录 零、最近感受和前言一、使用能够快速得到重建初始化的方法1.1 Colmap(多视角)1.2 深度估计(单视角)二、已知形状模板2.1 人脸2.2 人体2.3 动物三、刚性与非刚性约束(变形约束)3.1 刚性变形3.2 非刚性变形四、统计(深度学习)先验——从大量(3D)数据中提取信息…...
渗透利器:YAKIT 工具-基础实战教程.
YAKIT 工具-基础实战教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak语言开发的集成化网络安全单兵工具,旨在覆盖渗透测试全流程,提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…...
Kotlin 2.1.0 入门教程(二十一)数据类
数据类 数据类主要用于存储数据。 对于每个数据类,编译器会自动生成一些额外的成员函数,这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。 数据类使用 data 关键字标记: data class User(val name: String, val age: Int…...
Python学习心得数据的验证
数据的验证是指程序对用户输入的数据进行”合法“性验证 一、 数据的验证的一些方法: 方法名 描述说明 str.isdigit() 所有字符都是数字(阿拉伯数字) str.isnumeric() 所有字符都是数字 str.isalpha() 所有字符都是字母(包含中文字符) str.isalnum() 所有…...
PyQt6/PySide6 的信号与槽原理
一、核心原理剖析 1.1 观察者模式的GUI实现 信号与槽机制基于观察者模式实现解耦通信,相比传统GUI回调机制具备: 类型安全:信号参数与槽参数自动匹配松耦合:发送者无需知道接收者存在多对多连接:一个信号可绑定多个…...
jenkins 配置ssh拉取gitlab
一、生成key ssh-keygen -t rsa -b 4096 -C "root" 二、将id_rsa内容拷贝到jenkins 公钥id_rsa.pub拷贝到gitlab...
基于css实现正六边形的三种方案
方案一:通过旋转三个长方形生成正六边形 分析: 如下图所示,我们可以通过旋转三个长方形来得到一个正六边形。疑问: 1. 长方形的宽高分别是多少? 设正六边形的边长是100,基于一些数学常识,可以…...
