topk算法
方法一 堆排序
自建堆 heapMax方法,从上至下调整堆
pop时,可以使用自上而下调整堆,调用heapMax(arr,0,sz-1);
push时,需要自下到上调整即
从上到下调整:
void heapDown(vector<int>& arr,int start,int end)
{
int dad = start;
int son = 2 * dad + 1;
while(son<=end) //可以取到end
{
if(son+1<=end && arr[son]<arr[son+1]) ++son;
if(arr[son]<arr[dad]) return;
else
{
swap(arr[son],arr[dad]);
dad = son;
son = 2 * dad + 1;
}
}
}
从下到上:
```cpp
//从下到上调
int son = sz-1;
int dad = (son-1)/2;
while(dad>=0)
{
if(arr[son]<=arr[dad]) return;
else
{
swap(arr[son],arr[dad]);
son = dad;
dad = (son-1)/2;
}
}
```
建堆
for(int i=(len/2)-1;i>=0;--i)
{
heapDwon(heap,i,len-1);
}
堆代码
class Solution {
public:
//堆排序 从0 开始
void heapDown(vector<int>& arr,int start,int end)
{
int dad = start;
int son = 2 * dad + 1;
while(son<=end) //可以取到end
{
if(son+1<=end && arr[son]<arr[son+1]) ++son;
if(arr[son]<arr[dad]) return;
else
{
swap(arr[son],arr[dad]);
dad = son;
son = 2 * dad + 1;
}
}
}
void push(vector<int>& arr,int val)
{
arr.push_back(val);
int sz = arr.size();
//从下到上调
int son = sz-1;
int dad = (son-1)/2;
while(dad>=0)
{
if(arr[son]<=arr[dad]) return;
else
{
swap(arr[son],arr[dad]);
son = dad;
dad = (son-1)/2;
}
}
}
void pop(vector<int>& arr)
{
swap(arr[0],arr[arr.size()-1]);
arr.pop_back();
int sz = arr.size();
heapMax(arr,0,sz-1);
}
vector<int> smallestK(vector<int>& arr, int k) {
//堆
// priority_queue<int,vector<int>,less<int>> heap; //大顶堆
// //priority_queue<int,vector<int>,greater<int>> c;
//自定义堆
if(k==0) return {};
vector<int> heap(k);
for(int i=0;i<k;++i)
{
heap[i] = arr[i];
}
for(int i=k/2-1;i>=0;--i)
{
heapMax(heap,i,k-1);
}
for(int i=k;i<arr.size();++i)
{
if(arr[i]<heap[0])
{
pop(heap);
push(heap,arr[i]);
}
}
return heap;
}
};
方法二:快排思维(平均时间复杂度O(n)) topk思路
partition函数负责每次找到pivot,并分为2段
//加入随机思路
int randIndex = rand(time) % ((right-left+1)+left);
swap(arr[randIndex],arr[right]);
int pivot = arr[right];
判断条件:
1. k-1<p 说明k在p左边,因此递归查找左边
2. k-1>p 说明k在p右边,因此递归查找左边
3. k-1==p ,说明找到第k大,即左边为k个最小的元素
```cpp
//快排
int partition(vector<int>& arr,int left,int right)
{
int i = left,j=left;
int randIndex = rand(time) %((right - left + 1) + left); //长度加left
swap(arr[randIndex],arr[right]);
int pivot = arr[right];
for(;j<right;++j)
{
if(arr[j]<pivot)
{
swap(arr[i],arr[j]);
++i;
}
}
swap(arr[i],arr[right]);
return i;
}
void helper(vector<int>& arr, int k,int left,int right,vector<int>& res)
{
if(left>right) return;
int p = partition(arr,left,right);
if(k-1==p) //find k
{
for(int i=0;i<k;++i)
{
res.push_back(arr[i]);
}
}
else if(k-1<p)
{
helper(arr,k,left,p-1,res);
}
else
{
helper(arr,k,p+1,right,res);
}
return;
}
```
topk算法的更多相关文章
- 关于堆排序和topK算法的PHP实现
问题描述 topK算法,简而言之,就是求n个数据里的前m大个数据,一般而言,m<<n,也就是说,n可能有几千万,而m只是10或者20这样的两位数. 思路 最简单的思路,当然是使用要先对这n ...
- java TopK算法
现有一亿个数据,要求从其中找出最小的一万个数,希望所需的时间和空间最小,也就是所谓的topK问题 TopK问题就是从海量的数据中取最大(或最小的)的K个数. TopK问题其实是有线性时间复杂度的解的, ...
- (转)基于快速排序的TOPK算法
基于快速排序的TOPK算法 转自:http://blog.csdn.net/fanzitao/article/details/7617223 思想: 类似于快速排序,首先选择一个划分元,如果这个划分元 ...
- topK 算法
搜索引擎热门查询统计 题目描述: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然 ...
- Python 实现转堆排序算法原理及时间复杂度(多图解释)
原创文章出自公众号:「码农富哥」,欢迎转载和关注,如转载请注明出处! 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多 ...
- 大数据热点问题TOP K
1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
大数据计算:如何仅用1.5KB内存为十亿对象计数 Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...
- HashTable和HashSet中的类型陷阱
HashTable和HashSet中的类型陷阱 发现这个陷阱的起因是这样的:我现在有上百万字符串,我准备用TopK算法统计出出现次数做多的前100个字符串. 首先我用Hashtable统计出了每个字符 ...
- sdn测量论文简介
Prelude: Ensuring Inter-Domain Loop-Freedom in SDN-Enabled Networks 来源:APNet: The Asia-Pacific Works ...
随机推荐
- spl_autoload_register 实现自动加载
spl_autoload_register 注册给定的函数作为 __autoload 的实现 bool spl_autoload_register ([ callable $autoload_func ...
- CometOJ-[Contest #10]鱼跃龙门【exgcd】
正题 题目链接:https://cometoj.com/problem/1479 题目大意 给出\(n\)求一个最小的\(x(x>0)\)满足 \[\left(\sum_{i=1}^xi\rig ...
- Django整理(四) - URL配置
1. URL配置 一.需求 1. 需求:在浏览器访问URL地址 http://127.0.0.1:8000/users/index 时,显示hello django信息 2. 实现 i. 需要编写一个 ...
- 沈抚示范区·“华为云杯”2021全国AI大赛圆满落
摘要:以赛促学,赛教结合!驱动AI产业繁荣发展 本文分享自华为云社区<云聚沈抚 · 智赢未来!沈抚示范区·"华为云杯"2021全国AI大赛圆满落幕>,作者:灰灰哒. 近 ...
- Serverless 工程实践 | 零基础上手 Knative 应用
作者|刘宇 前言:Knative 是一款基于 Kubernetes 的 Serverless 框架.其目标是制定云原生.跨平台的 Serverless 编排标准. Knative 介绍 Knative ...
- bzoj2460元素(线性基,贪心)
题目大意: 给定\(n\)个二元组\((a,b)\),求一个最大的\(\sum b\)的集合,满足这个集合的任意子集的\(a\)的\(xor\)值不为0 这道题需要一个线性基的性质: 线性基的任何非空 ...
- python中单引号、双引号和三引号
在python中字符串可以用双引号表示,也可以用单引号表示: str1 = 'hello world'str2 = "hello world" 这两种字符串的表示方法没有区别. p ...
- 【c++ Prime 学习笔记】第18章 用于大型程序的工具
大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...
- 【c++ Prime 学习笔记】第2章 变量和基本类型
2.1 基本内置类型 基本数据类型包含了算术类型(arithmetic type)和空类型(void) 算数类型,包含了字符.整型数.布尔值和浮点数 空类型,不对应具体的值 2.1.1 算术类型 算术 ...
- OO第四单元作业总结及课程总结
一.本单元作业架构设计 1.第一次作业 本单元首次接触到UML以及相关概念,在面对第一次作业时首先花了很大功夫去阅读官方接口中各种UmlElement的代码,才理解了输入的模型元素中各属性的含义.总的 ...