方法一 堆排序

自建堆 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. Charles安装https证书

    Charles抓取https的包,出现unknow,需要安装https证书.

  2. 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿

    背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...

  3. Vue3 如何修改端口

    build哪里去了?config哪里去了?配置都消失了? 对比之前Vue2 发现项目目录改动较大 找了很久才找到配置文件:node_modules\@vue\cli-service\lib\comma ...

  4. SQL Server 命令备忘录(持续更新...)

    1.删除表内容并重置ID truncate table 表名 2.开启SqlDependency监控数据库 在数据中执行以下查询: SELECT is_broker_enabled FROM sys. ...

  5. 跳表--怎么让一个有序链表能够进行"二分"查找?

    对于一个有序数组,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的时间复杂度降低为O(logn).那查找一个有序链表,有没有办法将其时间复杂度也降低为O(logn ...

  6. netty 处理客户端连接

    Netty如何处理连接事件 上文讲了Netty如何绑定端口,现在我们来阅读下netty如何处理connect事件.上文我们说了NioEventLoop启动后不断去调用select的事件,当客户端连接时 ...

  7. The Data Way Vol.1|风口下的开源市场:如何看待开源与商业的关系?

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  8. Multidimension Tools(多维工具)

    多维工具 # Process: 创建 NetCDF 栅格图层 arcpy.MakeNetCDFRasterLayer_md("", "", "&quo ...

  9. SpringBoot+WebSocket实时监控异常

    写在前面 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理. 因为 ...

  10. JavaScript表单输入合法控制

    写在前面 为了提高数据输入的容错性和数据库数据的安全性,除了后端对输入的数据的逻辑判断处理,还可以前端页面高效率处理,从而提高系统的可靠性,下面是这次项目中的自己写的一些符合当时需要的控制. 账号位数 ...