bfprt
bfprt
//找第k小的数 or 找第n-k大的数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; class Solution
{
public:
int getMinKByBFPRT(vector<int>& arr,int k)
{
if(k<||k>arr.size())
return ; vector<int> tmp(arr.begin(),arr.end());
return bfprt(tmp,,tmp.size()-,k);
}
private:
int bfprt(vector<int>& arr,int left,int right,int k)
{
if(left==right)
return arr[left]; //1.得到中位数
int pivot=getMedian(arr,left,right);
//2.根据中位数划分左右区间
vector<int> pivotRange(_partition(arr,left,right,pivot));
//3.找到中位数排序后的位置,判断k是不是中位数所在的下标范围内,如果在就找到了
if(k>=pivotRange[]&&k<=pivotRange[])
return arr[k];
else if(k<pivotRange[])
return bfprt(arr,left,pivotRange[]-,k);
else /*if(k>pivotRange[1])*/
return bfprt(arr,pivotRange[]+,right,k);
//return 0;
}
int getMedian(vector<int>& arr,int left,int right)
{
int nums=right-left+;
int offset=nums%==?:;//每五个为一组,求每组的中位数,放在中位数数组中
vector<int> midArr(nums/+offset);//中位数数组
for(int i=;i<midArr.size();++i)
{
int l=left+i*;
int r=l+;
midArr[i]=getMedianCore(arr,l,min(r,right));
}
//找中位数组的中位数
return bfprt(midArr,,midArr.size()-,midArr.size()/);
}
int getMedianCore(vector<int>& arr, int left, int right)
{
//中位数组排序,返回中间数
sort(arr.begin()+left,arr.begin()+right+);
return arr[(left+right)/+(left+right)%];//奇数和偶数情况
}
vector<int> _partition(vector<int>& arr,int left,int right,int pivot)
{
int small=left-;//small总是指向当前最小的位置,初始化为数组的首元素的前一位置
int big=right+;//big总是指向当前最大的位置,初始化为数组的尾元素的后一位置
int cur=left;
while(cur<big)
{
if(arr[cur]<pivot)
swap(arr[++small],arr[cur++]);
else if(arr[cur]>pivot)
swap(arr[cur],arr[--big]);
else
++cur;
}
vector<int> tmp{small+,big-};
return tmp;
}
}; int main()
{
Solution s;
vector<int> arr{};
cout<<s.getMinKByBFPRT(arr,)<<endl;
return ;
}
bfprt的更多相关文章
- BFPRT(线性查找算法)
BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.该算法的思想与快速排序思想相似,当然,为使得算法 ...
- BFPRT算法
解决的问题:在一个数组中找到最小的k个数 常规解法:1.排序,输出前k个数,时间复杂度O(n*log(n)). 2.利用一个大小为k的大根堆,遍历数组维持大根堆,最后返回大根堆就可以了,时间复杂度O( ...
- 查找第K小的数 BFPRT算法
出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- BFPRT 算法 (TOP-K 问题)——本质就是在利用分组中位数的中位数来找到较快排更合适的pivot元素
先说快排最坏情况下的时间复杂度为n^2. 正常情况: 最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空).此时,必须经过n-1次递归 ...
- 线性查找算法(BFPRT)
BFPRT算法的作者是5位真正的大牛(Blum . Floyd . Pratt . Rivest . Tarjan). BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素, ...
- 经典算法 BFPRT算法详解
内容: 1.原始问题 => O(N*logN) 2.BFPRT算法 => O(N) 1.原始问题 问题描述:给你一个整型数组,返回其中第K小的数 普通解法: 这道题可以利用 ...
- 算法搬运之BFPRT算法
原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提 ...
- Top K问题-BFPRT算法、Parition算法
BFPRT算法原理 在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分 ...
随机推荐
- 7 Serial Configuration 理解(二)
*Serial Configuration Mode 串行配置模式分为:Master Serial 和 Slave Serial (如下图)两类: 两者的区别在与CCLK的输入输出方向:主动模式下为输 ...
- tomcat的安装及配置
1.首先进tomcat官网下载zip压缩文件:http://tomcat.apache.org/download-90.cgi 2.解压缩到指定文件压(后面配置环境变量会用到) 3.配置环境变量 4. ...
- android 应用程序中执行Linux 命令
ADB 无线调试命令son = "setprop service.adb.tcp.port 5555\n" + "stop adbd\n" + "st ...
- 人生苦短,我用python,为什么选择python,python简介
认识 Python 人生苦短,我用 Python —— Life is short, you need Python  目标 Python 的起源 为什么要用 Python? Python 的特点 ...
- softmax与多分类
sotfmax 函数在机器学习和深度学习中有着广泛的应用, 主要用于多分类问题. softmax 函数 1. 定义 假定数组V,那么第i个元素的softmax值为 也就是该元素的指数 除以 所有元素的 ...
- Gym - 100971J (思维+简单bfs)
题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...
- audit:backlog limit exceeded
今天发现存储服务器业务不可用,服务器能ping通,远程不了! 到机房管理员那里查看服务器状态后,发现显示如下: 显然系统已经崩溃,只能先重启服务器,先恢复业务,然后针对backlog limit e ...
- Vue extend 学习
<div id="box"> <aa></aaa> </div> <script> var Aaa = Vue.exte ...
- 安装vue-cookie
// 安装cookie的命令// npm install vue-cookie --save// 为项目配置全局vue-cookieimport VueCookie from 'vue-cookie' ...
- Python 黏包及黏包解决方案
粘包现象 说粘包之前,我们先说两个内容,1.缓冲区.2.windows下cmd窗口调用系统指令 1 缓冲区(下面粘包现象的图里面还有关于缓冲区的解释) 每个 socket 被创建后,都会分配两个缓冲区 ...