方法一 堆排序

自建堆 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. centos7 发送邮件

    yum install sendmail mailx sharutils mutt libreport-plugin-mailx -y yum update libreport-plugin-mail ...

  2. P5607-[Ynoi2013]无力回天NOI2017【线性基,线段树,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P5607 题目大意 \(n\)个数字的序列,\(m\)次操作 区间\([l,r]\)异或上一个值\(v\) 询问区间 ...

  3. Kettle学习笔记(二)— 基本操作

    目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...

  4. iOS 15 无法弹出授权弹框之解决方案---Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.0

    2021年9月30日下午:我正愉快的期盼着即将到来的国庆假期,时不时刷新下appstoreconnect的网址,28号就提上去的包,今天还在审核中....由于这个版本刚升级的xcode系统和新出的iO ...

  5. vue3 专用 indexedDB 封装库,基于Promise告别回调地狱

    IndexedDB 的官网 https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API 这个大概是官网吧,原始是英文的,现在陆续是出中 ...

  6. macbook air m1上传文件到github

    一,首先安装git,打开ssh文件里的id_rsa.pub,然后复制所有内容. 二,github上申请自己的账号,右上角settings里选择SSH and GPG keys,点击new ssh ke ...

  7. 题解 CF961G 【Partitions】

    题目传送门 题目大意 给出\(n,k\),以及\(w_{1,2,..,n}\),定义一个集合\(S\)的权值\(W(S)=|S|\sum_{x\in S} w_x\),定义一个划分\(R\)的权值为\ ...

  8. Java(15)面向对象之继承

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201615.html 博客主页:https://www.cnblogs.com/testero ...

  9. Using C++ in VS Code

    Using C++ in VS Code ‍ Get Started with C++ and Windows Subsystem for Linux in Visual Studio Code ‍ ...

  10. Windows Terminal 和 WSL

    Windows Terminal ,配置启动目录为 WSL : \\wsl$\Ubuntu\home