BFPRT算法——在一个无序数组找出前k小的数

算法导论:快速找出无序数组中第k小的数 题目描述: 给定一个无序整数数组,返回这个数组中第k小的数。 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。 阅读详情

1、在一个无序数组找出前k小的数题目中,经典算法:

    利用快速排序,随机选择一个数作为划分值,分为小于,等于,大于的区域,如果等于区域没有命中,若小于则走左边,大于走右边。

2、BFPRT算法

     选择划分值方法不一样,后面过程相同(4、5相同)。

设函数为int func(arr[],k)

(1)5个数一组,后面不足5个数自己一组(不是必须要5个数一组的,只是习惯上使用) 此部分时间复杂度:O(1)

(2)每个组内部进行排序,组与组之间不排序   每一组排好时间复杂度:O(1),一共N/5组,所以此部分时间复杂度:O(1)*N/5 = O(N)

(3)此时每个组组内已有序,从这些组内取中位数(偶数取上中位数),组成新的数组newArr,该数组长度为N/5。

递归调用M=func(newArr,N/10),得到N/10小的数,也就是拿到newArr的上中位数(在N/5大的数组中取其中位数,N/5 *1/2)。T(N/5)

(4)取返回的M作为划分值,拿到原数组arr中进行划分,分为小于M,等于M,大于M的区域。O(N)

(5)如果等于区域没有命中,若小于则走左边,大于走右边。 T(7N/10)


为什么用BFPRT?因为随机选一个数,不能知道小于,等于,大于的区域的大小。可能划分不好,如果在等于区域没有命中,可能导致有一边递归规模过大,使用BFPRT是希望使得递归规模尽可能变小。



无序数组中找到最小的k个数 O(N)解法 快速排序原理方法和BFPRT方法 最简便的方法是循环K次,依次找出最小的,第2小的,第K小的值,时间复杂度O(N*K),这种方法使用于K比较小的时候,如个位数,如果N数据量很大,K也较大,不适用。因为K大于N时,时间复杂度变成O(N^2)。 第二种是堆排序,建立一个大根堆,时间复杂度是O(NlogK),此方法博客中有写到,详见堆排序。 一、用快速排序,随机取枢轴量可以做到平均时间复杂度O(N),但是值选的不好会退化到O(N^2... 阅读详情

相关推荐

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

数据分析之获取前N最大、最小值或索引

首先,为了获取前N的最大最小值或者索引,下面介绍了两种方法,大家可以视情况选择: 1、利用heapq模块,heapq模块中有两个函数: nlargest() nsmallest() 他们可以找到列表,元组,集合等数据结构中的最大或最小的n个元素,并以列表的形式返回。 此方法只适用于数组无序且没有重复元素;否则,会出现键值匹配混乱。 2、利用pandas模块排序 sort_values(), 默认从小到大 sort_values(ascending = False),从大到小排序 1. 获取数组前 N

捌椒的博客 1377

(project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解]

解决办法 第一步,检查自己是不是真的配置的不对,JAVA安装没,pack路径设置的对不对,这里有一位前辈的博文写的非常好,附加链接https://blog.youkuaiyun.com/ybhuangfugui/article/details/52225736#commentBox 第二步,如果按照前辈的博文设置的都一模一样,还是不对,想我下图这样。 那你来对地方了 方法很简单,你把你生成工程文件的路径彻底的...

展桑博客-BenjieBlog 2923

找出无序数组中最小的前k个数

基本思想:在快速排序的基础上进行改进。 具体代码如下:

bob908的专栏 3561

FPGA时序约束--实战篇(读懂Vivado时序报告)

本文将详细介绍如何读懂Vivado时序报告,包括报告的基本结构和如何分析报告。

mengzaishenqiu的博客 1万+

Zynq7020实战:ARM Cortex-A9降频避坑指南(附温度对比测试)

本文详细介绍了如何在Zynq7020平台上对ARM Cortex-A9处理器进行降频优化,以降低功耗并提升系统稳定性。通过分析时钟架构、提供实战操作步骤和温度对比测试数据,帮助开发者有效避免降频过程中的常见问题,实现嵌入式系统的高效能耗管理。

root9的博客 206

在一个数组中找到前k个小(大)的数

11.给定一个一维数组,找出其中最小的前K个数,要求算法的时间复杂度为O(nlogK) solution: 借鉴堆排序的算法,通过使用最小堆选出前K个最小的数。 首先创建size=K的最小堆;堆顶为堆中最大的元素。 然后遍历数组元素,往最小堆中插入元素,如果堆的个数已经达到K。那么新插入的元素需要和堆顶元素比较。如果这个元素小于 堆顶元素,将堆顶元素移除,插入新的元素。 最后当遍历结束

Nigel_Lee专栏 941

一键转换B站M4S缓存为MP4:无需FFMPEG命令的简易工具

本文介绍了一款专为B站用户设计的绿色工具,可将缓存的M4S视频和音频文件一键转换为通用MP4格式。该工具完全图形化操作,无需学习复杂的FFmpeg命令,解决了普通用户处理B站缓存视频的痛点。文章详细讲解了从下载、配置到转换的完整流程,并提供了常见问题排查与安全使用建议,帮助用户高效、安全地管理离线视频内容。

joy55的博客 480

快速选择算法Quick Select Algorithm(Java和C++代码实现)

what is Quick select? 快速选择是一种从无序列表找到第k小元素的选择算法。它从原理上来说与快速排序有关。同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。 快速选择及其变种是实际应用中最常使用的高效选择算法。 总体而言,Quick select采用和Quick sort类似的步骤。首先选定一个pivot,然后根据每个数字与该pivo...

zpznba的博客 3155

【WRF数据准备】生成 LCZ 对应的FRC_URB2D

WRF 静态地理数据准备

WW、forever的博客 410

少儿学编程系列--使用递归画出龙形曲线DragonCurve

龙形曲线(Dragon Curve) 龙形曲线(Dragon Curve)又叫分形龙,是一种自相似碎形曲线的统称,因形似龙的蜿蜒盘曲而得名 使用黄金比例画龙形曲线 根据黄金比例画一条龙曲线。每次递归,第一步向左转32.89度,移动0.74倍原距离;第二个递归步骤向右转46.99度,移动原来距离的0.55倍。请查看这个网页(https://larryriddle.agnesscott.org/ifs/heighway/goldenDragon.htm)了解关于龙形黄线数学的细节 龙形曲线效果 .

penriver的博客 2297

寻找无序数组中第k大的数

对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的数。排序算法的时间复杂度为O(nlogn),所以算法总的时间复杂度为O(nlogn)。// Simple C++ program to find k'th biggest element #include<iostream> #include<algorith

好记性不如烂笔头 1万+

华为OD机试双机位C卷 - 高矮个子排队 (C++/Py/Java/Js/Go/C)

华为OD机试双机位C卷 高矮个子排队,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 高矮个子排队。

qq_45776114的博客 2160

【经典面试题】无序数组中,求第K大的数(堆、荷兰国旗问题、bfprt算法)

bfprt算法

x0919的博客 3296

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

bfprt算法解析

首先讲一下bfprt算法是干嘛的? bfprt算法是用来求数组中第k小的元素的算法,bfprt算法可以在O(n)时间内求出答案。 算法思想: 对于求数组中第k小的元素的问题,我们已经有很好的常规算法了,这个算法在最好的情况下时间复杂度是O(n),但在最坏的情况下是O(n^2)的,其实bfprt算法就是在这个基础上改进的。 常规解法: 我们随机在数组中选择一个数作为划分值(number),...

qq_40938077的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

bfprt算法——无序数组中求第K小的数

package com.harrison.class18; import java.util.Comparator; import java.util.PriorityQueue; /** * @author Harrison * @create 2022-03-30-19:29 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */ public class Code01_bfprt { public static class MaxHeapComparator im

Harrison的学习博客 1182

算法13-BFPRT算法

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

mengyoufengyu的博客 1284

BFPRT算法

题目:给你一个无序整型数组,返回其中第K小的数。 暴力解:排序解决 O(N*logN) BFPRT算法 O(N) 在一个数组中,随机取一个数 做划分值, 随机选一个数,既能避免最好,也能避免最坏, 28.00 进阶二 12:27 ...

Mr_zhang66的博客 3241

Topk问题:bfprt算法: 无序数组arr,找出如果arr有序的话,第k小那个数是多少

1)非bfprt方法:快排的荷兰国旗问题partition是解决topK问题的核心所在,咱们在排序过程中找index,速度o(n),是一个概率累加问题 2)bfprt跟上面核心思想一模一样,只不过pivot,可不是随机找了,而是精心设计的中位数的中位数作为pivot。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 384

求无序数组第 K 大的数

规定,第一维数据从小到大,第一维数据一样的,第二维数组也从小到大。一组,不足一组的补齐一组,并对每组进行排序(由于固定是5个数一组进行排序,所以排序的时间复杂度。),取出每组的中位数,组成一个新的数组, 对新的数组求其中位数,这个中位数就是我们需要的值。的过程, 这个过程随机选择数组中的一个数,假设叫pivot,这个过程主要作用是将数组的。大的数,接下来的元素继续入堆,但是每入一个就弹出一个,最后,堆顶元素就是整个数组的第。返回两个值,一个是左边界和一个右边界,位于左边界和右边界的值均等于。

Practitioner 2259

在无序数组中求第K小的数

bfprt算法的讲解以及使用bfprt算法和改写快排两种方法解决“无序数组求第K小的数”问题

明朗晨光的专栏 1112

Topk问题:bfprt算法预备知识: 无序数组arr,找出如果arr有序的话,第k小那个数是多少

1)非bfprt方法:快排的荷兰国旗问题partition是解决topK问题的核心所在,咱们在排序过程中找index,速度o(n),是一个概率累加问题 2)bfprt跟上面核心思想一模一样,只不过pivot,可不是随机找了,而是精心设计的中位数的中位数作为pivot。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 325

BFPRT算法 线性时间选择第k小元素

文章目录BFPRT算法1. 应用场景2. 基本思想3. 算法实现4. 复杂度分析5. References BFPRT算法 1. 应用场景 线性时间内,从无序列表找到第k小的元素。 2. 基本思想 首先把数组按5个数为一组进行分组,最后不足5个的忽略。对每组数进行排序(如插入排序)求取其中位数。 把上一步的所有中位数移到数组的前面,对这些中位数递归调用BFPRT算法求得他们的中位数。 将上一步得...

wylu 1129

前k小的数--BFPRT算法/堆的特性

寻找数组中第k小的数,如数组: 5 3 4 2 7 9 6 第一小的数为2,第二小的数为3,第七小的数为9. 做到算法时间复杂度O(n). 解法1:BFPRT算法 1)分组。每五个一组,不满五个单独一组 2)组内排序。 3)将每组的中位数取出来作为一个数组 4)递归bfprt过程,找出划分的num 5)利用该num作为partation的划分num,如果目标小于partat...

Pichairen 683

BFPRT算法(五兄弟算法)——给你一个无序整型数组,返回其中第K小的数

BFPRT算法——给你一个无序整型数组,返回其中第K小的数

z1171127310的博客 413
上一篇: Manacher算法——找字符串最长的回文子串
下一篇: 3.1Hibernate-Collection
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值