topK问题解法
topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题。
var array = [10,7,8,6,3,1,5,2,4,9];
var k =6;
var len = array.length; fHeapSortK(array,len,k); console.log('topK result: ' + array); //堆排取出top K数据,小顶堆取最大的前K个数据,大顶堆取最小的前K个数据
function fHeapSortK(data,length,k){
fBuildSmallHeap(data,k);
//将前k个后面的数字,依次与堆顶比较,大于堆顶,就与堆顶交换
for(var i=k;i<length;i++){
if(data[i] > data[0]){
//交换堆顶与较大值
swap(data,0,i);
//0至k-1,前面K个数字调整为小顶堆
fAdjustSmallHeap(data,0,k-1);
}
}
}
//构造小顶堆
function fBuildSmallHeap(data,length){
//length是堆的大小,前K个数字,则是需要一个K长度的堆
//将数组中的前 m = Math.floor(length/2) 作为父节点,后面 length - m 个节点,都是父节点的孩子节点
//依次将所有父节点为三角形的堆,都调整为小顶堆,这样整个length长度的堆,就调整为一个小顶堆
//调整过程是递归的过程,实际发生的调整次数,不只 m 次
for(var i = Math.floor(length/2);i--;){
fAdjustSmallHeap(data,i,length);
}
console.log('small heap ' + data)
}
//调整堆为小顶堆
function fAdjustSmallHeap(data,loc,length){
var lChild = 2 * loc + 1,
rChild = 2 * loc + 2,
smallest = loc;
//判断左孩子,是否小于,小于就交换
if(lChild <= length && data[lChild] < data[smallest]){
smallest = lChild;
}
//判断有孩子,是否小于,小于就交换
if(rChild <= length && data[rChild] < data[smallest]){
smallest = rChild;
}
//最小索引不是原父节点的索引,则需要交换父节点和孩子
if(smallest != loc){
//交换父节点与左右孩子中最小的节点
swap(data,loc,smallest);
//交换后,父节点为孩子的三角形,要继续调整为小顶堆,爷爷节点为孩子的也要调整,递归进行
fAdjustSmallHeap(data,smallest,length);
}
}
//交换数据
function swap(data,a,b){
var temp = data[a];
data[a] = data[b];
data[b] = temp;
}
topK问题解法的更多相关文章
- topk两种解法
1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序 下面这个代码本身有一些错误,并且throw excption会在牛客上报错 c ...
- PHP 十万数字不同数组取最大的5个 (经典面试题topK) (原)
$arr = array(3,5,7,8,1,2,456,78,...101,2345,456); 类似上述数组,共有十万个元素,让我们取出TOP5,下面是我的解法,先上代码再讲解思路 functio ...
- 海量数据中的TOPK问题小结
1.利用堆找出最大的K个数 首先,先理解下用堆找出最大的K个数的常用解法,例如问题是“从M(M <= 10000)个数中找出最大的K个数” (1)利用最大堆 建立一个N=M大小的大顶堆,然后输出 ...
- 【Leetcode 堆、快速选择、Top-K问题 BFPRT】数组中的第K个最大元素(215)
这道题很强大,引出了很多知识点 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...
- 215. 数组中的第K个最大元素(TOP-K问题)
问题: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出 ...
- 如何解决TOP-K问题
前言:最近在开发一个功能:动态展示的订单数量排名前10的城市,这是一个典型的Top-k问题,其中k=10,也就是说找到一个集合中的前10名.实际生活中Top-K的问题非常广泛,比如:微博热搜的前100 ...
- 一文详解面试常考的TopK问题
首发公众号:bigsai ,转载请附上本文链接 前言 hello,大家好,我是bigsai哥哥,好久不见,甚是想念哇! 今天给大家分享一个TOPK问题,不过我这里不考虑特别大分布式的解决方案,普通的一 ...
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法
本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...
随机推荐
- angular2新建组件
1,使用ng g c hello 创建一个新的组件 它创建了4个文件,并更新了app.module.ts 如果想访问这个组件,只需要添加它的路由 成功访问这个组件 Import语句定义了我们需要用到的 ...
- 51nod——2476 小b和序列(预处理 思维)
对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置.比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到 ...
- PAT 乙级 1059
题目 题目地址:PAT 乙级 1059 题解 开始我是从暴力循环的角度考虑这道题,大概计算了一下时间复杂度应该不会超,但是很不幸没有通过,时间超限:之后考虑搜索算法可能优化不太好,因此就把输入的序列先 ...
- ajaxfileuplod 上传文件 essyui laoding 效果,防止重复上传文件
//放于上传前 function ajaxLoading(){ $("<div class=\"datagrid-mask\"></div>&qu ...
- mac利用套件管理工具homebrew正确地同时安装python2.7和python3
MAC OSX 正確地同時安裝 PYTHON 2.7 和 PYTHON3 Python3 出來了(其實已經出來很久了,暈)!但是還是有很多 library 還是使用 Python2.7,所以要 ...
- Python读取内容UnicodeDecodeError错误
1.错误现象 环境:Python3.7 描述: 用open方法获取文件句柄: 用read/readlines方法一次读取文件所有内容: 尝试了编码GB2312/GBK/GB18030/UTF-8,发现 ...
- beautifulsoup解析
beautifulsoup解析 python独有 优势:简单.便捷.高效 - 环境安装 需要将pip源设置为国内源 -需要安装:pip install bs4 bs4在使用时需要一个第三方库 pip ...
- 动态规划(入门,滚动数组,记录的都是状态):SWUSTACM-1010 魔兽争霸之最后的反击
题目: 1010: 魔兽争霸之最后的反击 Time Li ...
- Python登录人人网并抓取新鲜事
from sgmllib import SGMLParser import sys,urllib2,urllib,cookielib class spider(SGMLParser): def ...
- ajax提交表单,支持文件上传
当我们提交表单但是又不想要刷新页面的时候就可以考虑使用ajax来实现提交功能,但是这有个局限就是当有文件上传的时候是行不通的,下面借助于jquery.form可以很方便满足我们的需求. 1.表单写 ...