【学习笔记】BFPRT 算法
c++ nth_element 函数负责求出(不需要有序的)数组中第 n 大的元素。下面是一个实现这个任务的确定性算法。介绍是 deepseek 写的。
BFPRT (Median of Medians) Algorithm
- 分组: 将数组划分为若干组,每组包含5个元素(最终一组可能不满5个)。
- 中位排序: 对每组进行排序,并选出组内的中位数。
- 找到中位数: 将所有组的中位数组合成新数组,通过应用BFPRT算法找到该数组的中位数,作为基准值 (pivot)。
- 划分数组: 用基准值将数组划分为两部分,等于、大于基准值的部分。
- 递归选择: 根据中位数的位置,决定在左半部分或右半部分递归查找。
时间复杂度分析
-
分组和中位排序: 每组5个元素排序时的时间复杂度为O(1),总时间为O(n)。
-
找到中位数: 新数组规模为n/5,适用时间为T(n/5)。
-
划分后选择: 通过Median of Medians保证每次划分的规模至少多于7n/10,适用时间为T(7n/10)。
注:最少有 个数字大于 median of medians。因为有 组的 median 大于 median of medians,这些组里面第 1 2 大的数字大于组里面的 median。
-
总时间复杂度: T(n) = T(n/5) + T(7n/10) + O(n),最终时间复杂度为O(n)
注:这里应该对 n 归纳即可证明
关键特点
- 确定性: 不依赖随机选择,每一步操作固定。
- 线性时间: 最坏情况下仍然是O(n),通过保证每次划分问题规模最小化,从而缩小了递归深度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律