线性时间内找到第k小的元素:快排应用与BFPRT算法

算法:线性时间选择(随机快排与STL) 算法:线性时间选择 给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数。 做法 :每次对数组进行随机选择一个数(此处我的选择是数组中间点),将其作为节点对其左右两边的数组进行划分,使其左边的部分数组小于其右边的数组,然后返回该数现在的坐标,作为quicksort返回值,然后比较该返回值与题目要求的第k值,如果恰好为该点则返回主函数并输出,若是大于k就在左边数组进行下一次划分,反之则进入右边进行。 #include <stdio 阅读详情

问题分析

面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为 O ( n log ⁡ 2 log ⁡ 2 n ) O(n\sqrt{\log_2 {\log_2 n}}) O(nlog2​log2​n ​),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2​n)。

但是,作为完美主义者的程序员,需要思考,找到第k小的元素一定需要排序吗?但除了寻找最大或最小的元素之外,我们似乎只能选择排序。那么能否只进行部分排序,便可找到第k小的元素呢?答案是显然的,只需要采用每一趟都能确定一个固定元素的排序算法即可。

思考 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2​n)的排序算法中有哪些算法每一趟可以确定一个固定元素,答案是快速排序和堆排序(不考虑锦标赛排序,堆排序是锦标赛排序的升级版)。这里以快速排序为例,方便引入后面介绍的BFPRT算法,不过还有一个原因是堆排序获取第k小的元素的时间复杂度是 O ( n ) O(n) O(n)的概率小于快速排序。

快排应用

我们知道,快排每一趟都会有随机有一个元素处于最终位置上,故只需在快排中设置一个新的递归出口再加以微改便能返回第k小的元素。
代码如下:
这里采用的快排为随机化快速排序,没有了解过的的朋友可以看一下我的另外一篇博客:升级版快速排序——随机化快速排序

template<typename T>
void partition(T array[],int left,int right,int& mid)
{
	srand(time(0));
	int i = left, j = right, move = rand() % (right - left + 1) + left;
	T temp = array[move];
	array[move] = array[left];
	while (i != j)
	{
		while (array[j] > temp&&j > i) j--;
		if (i < j) array[i++] = array[j];
		while (array[i] < temp&&i < j) i++;
		if (i < j) array[j--] = array[i];

	}
	array[i] = temp;
	mid = i;
}

template<typename T>
T random_quick_sort(T array[], int left, int right,int k)
{
	
	if (k > right - left + 1) exit(7);
	int i;
	partition(array, left, right, i);
	if (k == i - left + 1) return array[i];
	else if (k > i - left + 1) return random_quick_sort(array, i + 1, right, k - i + left - 1);
	else return random_quick_sort(array, left, i - 1, k);
}

这个算法的时间复杂度的确定需要用到指示器随机变量。 E [ T ( n ) ] = E [ ∑ k = 0 n − 1 X k ( T ( m a x E[T(n)]=E[\sum_{k=0}^{n-1}X_k(T(max E[T(n)]=E[∑k=0n−1​Xk​(T(max{ k , n − k − 1 k,n-k-1 k,n−k−1} ) ) + Θ ( n ) ] ))+\Theta(n)] ))+Θ(n)],最终得到 E [ T ( n ) ] = Θ ( n ) E[T(n)]=\Theta(n) E[T(n)]=Θ(n),即该算法的时间复杂度的期望值为 O ( n ) O(n) O(n)
但是存在最坏情况,即每一次划分只能划分出一个部分,即 T ( n ) = T ( n − 1 ) + Θ ( n ) T(n)=T(n-1)+\Theta(n) T(n)=T(n−1)+Θ(n),由等差级数可以得到最坏情况下的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

BFPRT算法

BFPRT算法由Blum、Floyd、Pratt、Rivest、Tarjan提出,故以其名首字母拼接命名。
在应用快排寻找第k小的元素时,最坏情况为 O ( n ² ) O(n²) O(n²)的原因是没有明显划分,为了“消除这个最坏情况”,只需要找到一个合适的值,使得划分具有意义,并且这个值递归迭代后仍保留这个性质。不妨称这个数为主元,BFPRT算法就找到了这样的一个主元。
下面开始欣赏这个算法的巧妙之处吧!

  • 首先,把数据按5个数为一组进行分组,最后不足5个的为一组
    在这里插入图片描述
  • 对每组数进行排序求得其中位数,图中标红部分为每组的中位数,用箭头表示两个数之间的大小关系,箭头的数比箭尾的数大,按照这样操作,便形成了如图所示的有向图模型。在这里插入图片描述
  • 对前面所求得的中位数进行排序(在图中对应列跟着一起动,但实际算法中不需要这样,此处这样操作是便于理解),求得中位数的中位数,各个中位数的大小关系也在图中体现了出来。在这里插入图片描述
  • 看到这里你可能会觉得这有什么卵用,别急,我一开始学的时候也是这么想的,来吧,展示!
    观察下面的图片,可以发现有一个矩形区域(紫色框)的所有数字都比中位数的中位数要大,有一个矩形区域(红色框)的所有数字都比中位数的中位数小。看到这里,聪明的读者应该知道这意味着什么了吧。
    在这里插入图片描述
    这意味着这个中位数的中位数便是我们寻找的一个主元,可以得到一个优质的划分。

接下来开始定量分析:
在该算法中,所有数据摆成了5行 ⌈ n 5 ⌉ \lceil \frac{n}{5} \rceil ⌈5n​⌉列,根据主元进行划分,可以得到至少有 ⌊ ⌊ n 5 ⌋ 2 ⌋ ∗ 3 \lfloor \frac{\lfloor \frac{n}{5} \rfloor}{2}\rfloor *3 ⌊2⌊5n​⌋​⌋∗3个数是小于主元的,至少有 ( 1 − ⌊ ⌊ n 5 ⌋ 2 ⌋ ) ∗ 3 (1-\lfloor \frac{\lfloor \frac{n}{5} \rfloor}{2}\rfloor )*3 (1−⌊2⌊5n​⌋​⌋)∗3的数是大于主元的。

在一开始的确定中值的时间开销为 Θ ( n ) \Theta(n) Θ(n)(因为每组数只有5个),接着递归求解中值的中值,时间开销为 T ( n 5 ) T(\frac{n}{5}) T(5n​),紧接着便是递归划分,由数学知识,当 n n n较大时 ⌊ ⌊ n 5 ⌋ 2 ⌋ ∗ 3 > n 4 \lfloor \frac{\lfloor \frac{n}{5} \rfloor}{2}\rfloor *3>\frac{n}{4} ⌊2⌊5n​⌋​⌋∗3>4n​,假设其余 3 n 4 \frac{3n}{4} 43n​的元素都比主元大,则每一次递归的最大子问题规模为 T ( 3 n 4 ) T(\frac{3n}{4}) T(43n​),故有 T ( n ) ≤ T ( n 5 ) + T ( 3 n 4 ) + Θ ( n ) T(n)≤T(\frac{n}{5})+T(\frac{3n}{4})+\Theta(n) T(n)≤T(5n​)+T(43n​)+Θ(n),由代换法解得 T ( n ) < = c n T(n)<=cn T(n)<=cn

下面给出BFPRT算法的具体代码实现:

  • 1° 首先把数组按5个数为一组进行分组,最后不足5个的为一组。对每组数进行排序求取其中位数,并将所有中位数移到当前数组的前面
  • 2° 对这些中位数重复(递归)1操作,最后返回最终的中位数
  • 3° 将上一步得到的中位数作为划分的主元进行整个数组的划分。(基于快速排序)
  • 4° 判断第k个数在划分结果的左边、右边还是恰好是划分结果本身,前两者递归处理,后者直接返回答案。
template<typename T>
void partition(T array[], int left, int right, int& mid)
{
	int i = left, j = right;
	T temp = array[left];
	while (i != j)
	{
		while (array[j] > temp&&j > i) j--;
		if (i < j) array[i++] = array[j];
		while (array[i] < temp&&i < j) i++;
		if (i < j) array[j--] = array[i];

	}
	array[i] = temp;
	mid = i;
}

template<typename T>
void quick_sort(T array[], int left, int right)
{

	if (left >= right) return;
	int i;
	partition(array, left, right, i);
	quick_sort(array, i + 1, right);
	quick_sort(array, left, i - 1);
}


template<typename T>
void grouping(T arr[], int left, int right)
{
	int  count = left;
	for (int i=left; i <= right; i += 5)
	{
		if (i + 5 <= right)
		{
			quick_sort(arr, i, i + 4);
			swap(arr[i + 2], arr[count++]);
		}
		else 
		{
			quick_sort(arr, i, right);
			swap(arr[(i + right) / 2], arr[count++]);
		}
		
	}
}

template<typename T>
void findmid(T arr[],int left,int right)
{
	grouping(arr, left, right);
	if (right - left <= 4) return;
	else findmid(arr, left, left + (right - left + 1) / 5);
}

template<typename T>
T BFPRT(T arr[],int left,int right,int k)
{
	if (k > right - left + 1) exit(7);
	grouping(arr, left, right);
	findmid(arr, left, left + (right - left + 1) / 5 );
	int mid;
	partition(arr, left, right, mid);
	if (k == mid - left + 1) return arr[mid];
	else if (k > mid - left + 1) return BFPRT(arr, mid + 1, right, k - mid + left - 1);
	else return BFPRT(arr, left, mid - 1, k);
}

在任何情况下,BFPRT算法在任意情况下都可以在线性时间内求出第k小的元素,它的思想主要是以每5个元素为一组,找出中位数的中位数的中位数的…中位数。如果3个元素为一组,将达不到这个效果。5是能达到效果的最小数字,7也可以成立,但性能提升不明显。

分治法:线性时间选择 大家好,我是连人,本期分享线性时间选择问题。 线性时间选择是基于快速排序的一种延申,本质上和快排具有类似的地方。它的目的是找出这个数组中第k小的值。 既然只需找出1个值,我们就不必将整个数组排序。通过分治法和分区(partition)可以只将k所在范围内的值进行查找即可。 当然可以使用二分法去确立k的范围,但是我的课本上没有所以我们今天不讨论。 下面介绍两种算法:随机选择和中位数选择。 随机选择 ... 阅读详情

相关推荐

价值投资/指标选股(akshare)

利用akshare的数据源,可以获取所有的股票数据以及公开的财务数据,可以进行条件筛选,获取满足条件的股票。 这套模板可以用于价值投资,指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak ## A 股上市公司的实时行情数据 stock_zh_a_spot_df = ak.stock_zh_a_spot() #print(stock_zh_a_spot_df) ##取前300测试 ##取前300测试 df_stock =...

qq_26742269的博客 1万+

第K小元素 时间复杂度n

文章目录一、题目分析二、计算思路伪代码三、Java实现四、时间复杂度 一、题目分析 给出一个n个元素的序列,求其中的第k小元素(即序列按升序排序后的第k个元素) 如果用排序时间复杂度nlogn,随机快速排序时间复杂度n。 但是这里采用一种分治的方法使时间复杂度为n。若分治算法中,每次分解子问题后,只取其中一个子问题解之,丢弃其余的子问题。每次递归调用,问题的规模以常数因子被减小。设分解问题只需线性时间,则算法的时间复杂性满足Θn\Theta nΘn。 二、计算思路伪代码 大致思路是选一个“主元”,比他大的

搭车去柏林的博客 4362

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线

本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。

weixin_26878995的博客 241

线性时间选择—寻找第k小的数(分治算法)

问题描述: 找出一个数组中第K小的元素,时间复杂度为O(n)。 思想 首先,找出数组元素的中位数的中位数,然后利用Partition函数对整个数组进行划分,以数组中中位数的中位数为基准将数组划分为两部分——左边部分的所有数都小于基准,右边部分都大于基准,并返回基准数的下标值。 最后,如果要找到第k小个数,就将k的大小与数组左半边元素的个数(包括基准)进行比较,如果k小于j,则对左边部分进行递归,找第k小个数;若k大于j,则对右边部分进行递归,找第k减去j个小数。 代码如下: #include "stdafx

qyh的博客 5500

图文实录|大规模预训练模型:探讨与展望

第二期「澜舟分享会」我们邀请到来自复旦大学计算机学院邱锡鹏教授分享了“大规模预训练模型:探讨与展望”,本此演讲主要围绕大规模预训练语言模型展开讨论,并探讨大模型成功的原因、适用场景、未来发展方向以及身处大模型时代我们的机遇。

langboat_mengzi的博客 1205

基于PCL的电力线点云提取与分割实现

本文基于PCL库实现电力线点云提取与分割,包含6个核心处理阶段:文件读取与结果文件夹创建、高程滤波分割候选点云、欧式聚类去噪、电力线分段提取、球形邻域搜索补全点云、最终分割与可视化保存。通过PCA计算点云线性特征(阈值0.91)筛选电力线点,采用欧式聚类(容忍度3.0)去除噪点,并针对不同规模聚类差异化设置球形搜索半径(4.0/6.0)补全点云。最终通过欧式聚类分割并可视化带颜色点云。算法对高程滤波阈值、聚类参数等具有敏感性,需根据点云特性调整优化。

weixin_45196569的博客 192

第k小元素(顺序统计量)

在一个含有n个元素的集合中,有时我们需要找到第该集合中第kk个小的元素,这也被称作第kk个顺序统计量(order statistic)。在前面我们已学过排序, 我们可以将集合进行排序后,直接输出第kk个元素。但是我们目前我们知道的排序中最好的时间复杂度就是O(nlog(n))O(nlog(n)). 接下来我们要使用两种方法找出第k小元素,其在某些过程用到排序,但我们并不会对整个集合进行排序,也不会使

yzf0011的专栏 2181

一句话看懂 vibing-steampunk

摘要: vibing-steampunk(vsp)是一个连接SAP ABAP开发工具(ADT)与AI编码代理(如Claude、GitHub Copilot)的桥梁,通过MCP协议实现自动化代码读写、调试和部署。它利用ADT API直接访问SAP系统,绕过传统GUI操作,支持ECC和S/4HANA等环境。工具提供包分析、依赖检查、LUW行为识别等功能,显著提升ABAP项目维护效率。其创新Hyperfocused模式和方法级编辑大幅降低token消耗,而上下文压缩技术则优化了AI对ABAP代码的理解能力,特别适

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

线性时间找到第k小的元素:快排应用与BFPRT算法

问题分析 面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为O(nlog⁡2log⁡2n)O(n\sqrt{\log_2 {\log_2 n}})O(nlog2​log2​n​),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为O(nlog⁡2n)O(n\log_2 n)O(nlog2​n)。 但是,作为完美主义者的程序员,需要思考,找到第k小的元素一定需要排序吗?但除了寻找最大或最小的元素之外,我们似乎只能选择排序。那么能否只进行部分

RealCoder的博客 504

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 642

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2611

C语言线性时间求解第k小,线性时间找到第k小的元素:快排应用与BFPRT算法

问题分析面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为O(nlog⁡2log⁡2n)O(n\sqrt{\log_2 {\log_2 n}})O(nlog2​log2​n​),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为O(nlog⁡2n)O(n\log_2 n)O(nlog2​n)。但是,作为完美主义者的程序员,需要思...

weixin_42306501的博客 260

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

关于开关节点振荡的产生机制和抑制问题,总结了三种抑制方法。第一种方法是利用输入端的高频去耦电容;第二种方法是设计 RC 缓冲电路;第三种方法是优化自举电路的串联电阻。以上三种方法均通过实验加以验证,对开关节点振荡具有很好的抑制作用。应该综合同步 Buck 变换器的各项指标权衡设计。

小幽余生不加糖 1633

BFPRT(中位数的中位数)算法

BFPRT 算法又称为 “中位数的中位数算法”,该算法由 Blum、Floyd、Pratt、Rivest、Tarjan 在1973年提出,最坏时间复杂度为 O(n) TOP-K问题

BENULL的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法13-BFPRT算法

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

mengyoufengyu的博客 1284

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

第k个小的数 bfprt算法与快排改进

文章目录关于第k小的数 O(N)改进快排思路 O(N) 最坏情况下复杂度为O(n^2)(排序趋近于有序的情况下)bfprt算法(5位MIT大牛的名字首字母缩写)最坏情况下复杂度为O(n)。如何选数这样选 妙在哪里?最坏复杂度为O(N)master公式算法开创一个时代 关于第k小的数 O(N) 改进快排思路 O(N) 最坏情况下复杂度为O(n^2)(排序趋近于有序的情况下) public static int findk(int[] nums,int m,int n ,int k) { int temp

hch977的博客 355

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

bfprt算法求最小的k个数

bfprt算法是一种经典的线性时间内求最小的第k个数或者最小的k个数的算法。 比如我们要知道销量是前几名商品或者是浏览量最多的前几个网站,我们不需要排序,利用bfprt算法就可以完成。 bfprt算法又称快速选择算法,其思想是利用快速排序的划分来确定位置。此算法经典而优雅,值得我们学习。 步骤          1.将输入的元素划分为5个元素一组,至多有一组不足5个元素。

l-jobs的专栏 1100

【Top -K问题】BFPRT算法与堆

问题背景:在一大堆数中求其前k大或前k小的问题,简称TOP-K问题。 题目链接 这是一类很经典的问题可以有多种解决的方法,这些方法中包含了一些巧妙的数据结构和算法思想。因此简单的排序取值的方法就不再说了。 方法一: 利用快排实现查找。 按照从大到小排序,然后每次计算多少大于标定值的,每次缩小搜查范围。 class Solution(object): def findKthLargest(s...

遍地跑小鸡的博客 346

【算法笔记】bfprt算法

bfprt算法的核心思想bfprt算法也常被称为中位数的中位数算法。它的核心目标是选择一个高质量的“主元”(pivot),使得在后续的划分(Partition)过程中,数组能够被相对均匀地分成两部分。这与快速选择算法思想类似,但bfprt通过一种确定性的方法来选择主元,避免了因主元选择不当而导致性能退化为O(n²)的最坏情况。简单来说,bfprt算法通过分组寻找中位数的中位数来确定主元,从而确保每次划分至少能淘汰一定比例的元素,使得问题规模以几何级数减少,最终保证线性时间复杂度。

u012559967的专栏 673

经典算法 BFPRT算法详解

内容: 1、原始问题 =》 O(N*logN) 2、BFPRT算法 =》 O(N) 1、原始问题 问题描述:给你一个整型数组,返回其中第K小的数 普通解法: 这道题可以利用荷兰国旗改进的 partition 和随机快排的思想:随机选出一个数,将数组以该数作比较划分为 <,=,> 三个部分, 则 = 部分的数是数组中第几小的数不难得知,接着...

weixin_34417183的博客 362

快速选择算法(线性选择算法)+BFPRT算法优化:O(n)复杂度选择第k大的数

什么是快速选择算法? 快速选择算法可以在O(n)的时间复杂度内,选择一个无序随机数组中第k小(大)的元素,它是根据快速排序算法的思想简化而来的。 快速选择算法同样利用了分治回归策略,由于只需要选择出第k小(大)的元素,因此它在分治之后只需要考虑符合条件一边的元素情况。它同样利用了快速排序的分割元素集的思想,随机产生一个基数key,将小于基数分到左边,大于基数的分到右边,然后判断基数位置与选择k个最小(大)元素的大小关系,来确定是下一步是选择左区间还是右区间。 代码: #include<io.

马小超 1213

BFPRT

解决的问题: 在一个无需数组中,找到第 k 个大,或者第 k 个小的数 经典思路:类似于快排 我们想要 第 200 小的数 随机选一个数,假设我们选到的数是300,一次遍历,将小于这个数的放左边,等于放中间,大于放右边,得到 x1 和 x2 的位置,x1=300 x2=350 那么 第200小的数 肯定在新数组的 左半部分,我们把左半部分拿出来,再进行这样的划分,最终得到想要的 第 200 小的值...

Venlexi 970

BFPRT算法

世界十大经典算法之一,由Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan提出,这个算法也解了我之前的对某问题的疑惑。 说个题外话,曾经面试的时候被问到的是如何在n个数中找出第二大的数,

shzxrt的专栏 1156

计算机算法-线性寻找第k小(大)元素(Top K)BFPRT算法

计算机算法-线性寻找第k小(大)元素(Top K)BFPRT算法

qq_43838114的博客 599

bfprt算法

BFPRT这一名称来源于该算法的五位作者的首字母,在维基百科上,该算法被称为Median of medians,因为中位数在这里起到了至关重要的角色。 bfprt算法是用来求数组中第k小的元素的算法,bfprt算法可以在O(n)时间内求出答案。在数组范围随机选取一个数,进行partition(荷兰国旗问题,小于放左边,等于放中间,大于放右边),返回等于区的区间range,如果要k小于range[0],说明k在小于区里,再在小于区里进行快排,如果k大于range[1],说明k在大于区里,再在大于区里进行快排,

xiaolu567的博客 883

BFPRT 算法 (TOP-K 问题)——本质就是在利用分组中位数的中位数来找到较快排更合适的pivot元素...

先说快排最坏情况下的时间复杂度为n^2。 正常情况: 最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空)。此时,必须经过n-1次递归调用才能把所有记录定位,而且第i趟划分需要经过n-i次比较才能找个才能找到第i个记录的位置,因此时间复杂度为 所以BFPRT本质上是在寻找...

djph26741的博客 305
上一篇: 线性时间找到第k小的元素:快排应用与BFPRT算法
下一篇: 哈希表(散列表)之乘法哈希(散列)法
RealWeakCoder
博客等级 码龄7年 236粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值