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的更多相关文章

  1. BFPRT(线性查找算法)

    BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.该算法的思想与快速排序思想相似,当然,为使得算法 ...

  2. BFPRT算法

    解决的问题:在一个数组中找到最小的k个数 常规解法:1.排序,输出前k个数,时间复杂度O(n*log(n)). 2.利用一个大小为k的大根堆,遍历数组维持大根堆,最后返回大根堆就可以了,时间复杂度O( ...

  3. 查找第K小的数 BFPRT算法

    出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...

  4. 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)

    第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...

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

    先说快排最坏情况下的时间复杂度为n^2. 正常情况:   最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空).此时,必须经过n-1次递归 ...

  6. 线性查找算法(BFPRT)

    BFPRT算法的作者是5位真正的大牛(Blum . Floyd . Pratt . Rivest . Tarjan). BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素, ...

  7. 经典算法 BFPRT算法详解

    内容: 1.原始问题     =>  O(N*logN) 2.BFPRT算法    => O(N) 1.原始问题 问题描述:给你一个整型数组,返回其中第K小的数 普通解法: 这道题可以利用 ...

  8. 算法搬运之BFPRT算法

    原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提 ...

  9. Top K问题-BFPRT算法、Parition算法

    BFPRT算法原理 在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分 ...

随机推荐

  1. 7 Serial Configuration 理解(二)

    *Serial Configuration Mode 串行配置模式分为:Master Serial 和 Slave Serial (如下图)两类: 两者的区别在与CCLK的输入输出方向:主动模式下为输 ...

  2. tomcat的安装及配置

    1.首先进tomcat官网下载zip压缩文件:http://tomcat.apache.org/download-90.cgi 2.解压缩到指定文件压(后面配置环境变量会用到) 3.配置环境变量 4. ...

  3. android 应用程序中执行Linux 命令

    ADB 无线调试命令son = "setprop service.adb.tcp.port 5555\n" + "stop adbd\n" + "st ...

  4. 人生苦短,我用python,为什么选择python,python简介

    认识 Python 人生苦短,我用 Python —— Life is short, you need Python  目标 Python 的起源 为什么要用 Python? Python 的特点 ...

  5. softmax与多分类

    sotfmax 函数在机器学习和深度学习中有着广泛的应用, 主要用于多分类问题. softmax 函数 1. 定义 假定数组V,那么第i个元素的softmax值为 也就是该元素的指数 除以 所有元素的 ...

  6. Gym - 100971J (思维+简单bfs)

    题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...

  7. audit:backlog limit exceeded

    今天发现存储服务器业务不可用,服务器能ping通,远程不了!  到机房管理员那里查看服务器状态后,发现显示如下: 显然系统已经崩溃,只能先重启服务器,先恢复业务,然后针对backlog limit e ...

  8. Vue extend 学习

    <div id="box"> <aa></aaa> </div> <script> var Aaa = Vue.exte ...

  9. 安装vue-cookie

    // 安装cookie的命令// npm install vue-cookie --save// 为项目配置全局vue-cookieimport VueCookie from 'vue-cookie' ...

  10. Python 黏包及黏包解决方案

    粘包现象 说粘包之前,我们先说两个内容,1.缓冲区.2.windows下cmd窗口调用系统指令 1 缓冲区(下面粘包现象的图里面还有关于缓冲区的解释) 每个 socket 被创建后,都会分配两个缓冲区 ...