方法一 堆排序

自建堆 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算法的更多相关文章

  1. 关于堆排序和topK算法的PHP实现

    问题描述 topK算法,简而言之,就是求n个数据里的前m大个数据,一般而言,m<<n,也就是说,n可能有几千万,而m只是10或者20这样的两位数. 思路 最简单的思路,当然是使用要先对这n ...

  2. java TopK算法

    现有一亿个数据,要求从其中找出最小的一万个数,希望所需的时间和空间最小,也就是所谓的topK问题 TopK问题就是从海量的数据中取最大(或最小的)的K个数. TopK问题其实是有线性时间复杂度的解的, ...

  3. (转)基于快速排序的TOPK算法

    基于快速排序的TOPK算法 转自:http://blog.csdn.net/fanzitao/article/details/7617223 思想: 类似于快速排序,首先选择一个划分元,如果这个划分元 ...

  4. topK 算法

    搜索引擎热门查询统计 题目描述:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.    假设目前有一千万个记录(这些查询串的重复度比较高,虽然 ...

  5. Python 实现转堆排序算法原理及时间复杂度(多图解释)

    原创文章出自公众号:「码农富哥」,欢迎转载和关注,如转载请注明出处! 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多 ...

  6. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  7. 大数据计算:如何仅用1.5KB内存为十亿对象计数

    大数据计算:如何仅用1.5KB内存为十亿对象计数  Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...

  8. HashTable和HashSet中的类型陷阱

    HashTable和HashSet中的类型陷阱 发现这个陷阱的起因是这样的:我现在有上百万字符串,我准备用TopK算法统计出出现次数做多的前100个字符串. 首先我用Hashtable统计出了每个字符 ...

  9. sdn测量论文简介

    Prelude: Ensuring Inter-Domain Loop-Freedom in SDN-Enabled Networks 来源:APNet: The Asia-Pacific Works ...

随机推荐

  1. jenkins+requests+pytest+allure持续集成

    环境搭建参考:https://www.jianshu.com/p/fc39030d057f 总体流程:

  2. Oracle基本入门

    一.数据的存储 1.java 程序中的对象:数组.集合保存.当运行的程序结束的时候,里面的数据就消亡. 2.文件存储系统: 存在的缺陷: 2.1)没有明确的数据类型划分. 2.2)没有用户身份验证机制 ...

  3. Initialize this repository with a README

    在gitHub创建项目时,有很多小伙伴不太清楚 Initialize this repository with a README 在什么情况下需要勾选,在这里简单说明 如下: 1. 翻译 如果要导入现 ...

  4. SpringBoot下使用AspectJ(CTW)下不能注入SpringIOC容器中的Bean

    SpringBoot下使用AspectJ(CTW)下不能注入SpringIOC容器中的Bean 在SpringBoot中开发AspectJ时,使用CTW的方式来织入代码,由于采用这种形式,切面Bean ...

  5. 题解 ABC216H Random Robots

    link Solution 考虑一个不合法方案,它一定最后位置的逆序对数不为 \(0\),而且可以发现的是,存在对称方案使得最后逆序对数奇偶性不同,所以我们如果加上 \((-1)\)^{\sigma( ...

  6. 洛谷4103 HEOI2014大工程(虚树+dp)

    又是一道虚树好题啊 我们建出来虚树,然后考虑dp过程,我们分别令\(sum[x],mndis[x],mxdis[x],size[x]\)为子树内的路径长度和,最短链,最长链,子树内关键点个数. 对于一 ...

  7. 洛谷3244 落忆枫音 (拓扑图dp+式子)

    题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...

  8. 关于C、Java、Python程序运行耗时及内存用量

    最近没有刷题,而是在PTA找几个题目寻找有关程序输入流问题以及各种语言在运行时对计算机消耗内存的问题, 以免很多同学解题的时候发现自己做的对但是出现运行超时的问题:针对运行内存,肯定用C/C++的同学 ...

  9. Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)

    基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 , ...

  10. Flask 易错点

    1.With上下文管理器 常用: with open("file_name","wb") as f: f.write("hello flask&quo ...