堆排序——top k问题
问题:现在有n个数,设计算法得到前k大的数。(k<n)
解决思路:
1. 排序后切片 O(nlog n)
2. 排序LowB三人组 O(kn)
3. 堆排序思路 O(nlog k)
堆排序解决:
1. 取列表前k个元素建立一个小根堆,堆顶就是目前第k大的数
2. 依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;
如果大于 堆顶,则将堆顶更换为该元素,并且对堆顶进行一次堆调整;
3. 遍历列表所有元素后,倒序弹出堆顶
def small_sift(li,low,high):i = low j = 2*i + 1tmp = li[low]while j <= high:if j + 1 <= high and li[j+1] < li[j]: # 改成小根堆的形式,j = j + 1if li[j] < tmp: # 改成小根堆的形式,li[i] = li[j]i = jj = 2*i + 1else:li[i] = tmpbreakelse:li[i] = tmpdef topk(li,k):heap = li[0:k]# 1.建堆for i in range((k-2)//2,-1,-1):small_sift(heap,i,k-1) # 2.遍历for i in range(k,len(li)-1):if li[i] > heap[0]:heap[0] = li[i]small_sift(heap,0,k-1)# 3.出数for i in range(k-1,-1,-1):heap[0],heap[i] = heap[i],heap[0]small_sift(heap,0,i-1)return heap
import random
li = list(range(100))
random.shuffle(li)
print(topk(li, 10))
堆排序——top k问题相关推荐
- 用scala语言实现并行堆排序(top k)
因为项目需要对大量数据进行排序计算top k,开始了解并行计算框架,接触了spark,spark都是用scala写的,所以为了了解spark,恶补了一阵scala语言. 这是一种非常简练的函数式语言, ...
- 二叉树(三)——堆排序优化、TOP K问题
一.堆排序优化 上一讲采用先独立建小堆,再把数组元素全部放入小堆中,最后从小堆弹出所有元素实现堆排序,固然达到了O(NlogN)的时间复杂度,但空间复杂度为O(N),值得优化. 优化堆排序的 ...
- 【LeetCode 剑指offer刷题】查找与排序题12:Top K Frequent Elements
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Top K Frequent Elements Given a non-empty array of integer ...
- 海量数据中找top K专题
1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...
- 海量数据处理的 Top K相关问题
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 Top-k的最小堆解决方法 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top ...
- 精确查找top k和非精确查找top k
信息检索里面经典问题. 精确top K 检索及其加速办法 •方法一:快速计算余弦 • 方法二:堆排序法N中选K • 方法三:提前终止计算 精确top K检索加速方法一: 快速计算余弦 • 检索排序就是 ...
- 最小堆解决Top K问题
问题描述: 有一组数据n个,要求取出这组数据中最大的K个值. 对于这个问题,解法有很多中.比如排序及部分排序,不过效率最高的要数最小堆,它的时间复杂度为O(nlogk). 解题思路: 取出数组的前n个 ...
- 最大堆、最小堆Java实现,解决TOP K问题
一.基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解. 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完 ...
- 求 top k有哪些方法
大家好, 此文章分享求top k有哪些方法 求 topk, 理解起来不难,就是很多元素中,找出前K个最大或者最小 假设我们求最大K元素 思路有以下几种: 1. 全局排序 所有元素加载到内存,来个全局排 ...
最新文章
- 骆驼iptv_骆驼路线的主/从故障转移
- J2ME手游开发日记
- 好程序员web前端分享MVVM框架Vue实现原理
- java绘画imo,搞死帮忙看下这个:需要为class interface或enum imort java.ut
- centOS安装oracleDB,静默安装DBCA的时候,报错
- 集群介绍 keepalived介绍 用keepalived配置高可用集群
- chrome redhat 下载源_RedHat 7.0 Chrome浏览器 安装
- 想自学PLC编程该按什么步骤来?
- springMVC+mybatis
- 利用pyecharts绘制雷达图的案例(含参数解释)
- PHP预处理器的配置文件名为,2)PHP预处理器配置文件名是什么?
- XtraReport通过动态设置打印模板进行标签打印
- SurfaceView和View最本质的区别
- XENOGEARS,延续万年的的永恒之爱(引)
- 力扣276 周赛 2139. 得到目标值的最少行动次数
- PL/SQL编程---流程控制语句
- 记一次虚拟机失联的奇葩经历
- python 波动率_用python计算投资组合方差和波动率
- eCPRI带宽与CPRI带宽需求为什么相差4倍?
- python小实例一:简单爬虫