topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题。

堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆外的元素依次与堆顶比较,若大于堆顶,则与堆顶交换,并将堆重新调整为小顶堆,依次比较完所有元素。则堆顶为堆中的最小元素,且为所有元素中的第K大的元素,则整个堆则为前K大的K个元素。若要取前K个小的数,则要使用大顶堆。
 
测试代码如下:
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问题解法的更多相关文章

  1. topk两种解法

    1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序 下面这个代码本身有一些错误,并且throw excption会在牛客上报错 c ...

  2. PHP 十万数字不同数组取最大的5个 (经典面试题topK) (原)

    $arr = array(3,5,7,8,1,2,456,78,...101,2345,456); 类似上述数组,共有十万个元素,让我们取出TOP5,下面是我的解法,先上代码再讲解思路 functio ...

  3. 海量数据中的TOPK问题小结

    1.利用堆找出最大的K个数 首先,先理解下用堆找出最大的K个数的常用解法,例如问题是“从M(M <= 10000)个数中找出最大的K个数” (1)利用最大堆 建立一个N=M大小的大顶堆,然后输出 ...

  4. 【Leetcode 堆、快速选择、Top-K问题 BFPRT】数组中的第K个最大元素(215)

    这道题很强大,引出了很多知识点 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...

  5. 215. 数组中的第K个最大元素(TOP-K问题)

    问题: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出 ...

  6. 如何解决TOP-K问题

    前言:最近在开发一个功能:动态展示的订单数量排名前10的城市,这是一个典型的Top-k问题,其中k=10,也就是说找到一个集合中的前10名.实际生活中Top-K的问题非常广泛,比如:微博热搜的前100 ...

  7. 一文详解面试常考的TopK问题

    首发公众号:bigsai ,转载请附上本文链接 前言 hello,大家好,我是bigsai哥哥,好久不见,甚是想念哇! 今天给大家分享一个TOPK问题,不过我这里不考虑特别大分布式的解决方案,普通的一 ...

  8. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  9. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

随机推荐

  1. opencv approxPolyDP使用

    代码: import cv2 import numpy as np # img = cv2.imread('/home/sensetime/edgeBoxes-Cpp-version/output/i ...

  2. C# 创建和初始化集合对象

    一. 引言 C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单.假定你有一个类Student,它看起来有如下样子: public class Stude ...

  3. Java 程序设计总复习题

    Java程序设计总复习题 1.编写一个Java程序在屏幕上输出“你好!”. //programme name Helloworld.java public class Helloworld { pub ...

  4. 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:

    package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...

  5. 问题004:如何在windows中打开命令行,有几种方法?

    第一种方法:按快捷键 Win+R (run),然后运行框中输入cmd. 第二种方法:开始菜单-->运行-->然后运行框中输入cmd. 第三种方法:在附件当中,找命令行选项即可.

  6. cocoapods 类库管理利器

    作为iOS开发者,第三方类库的使用是最经常的,但鉴于第三方类库的不断更新以及其可能需要依存其他类,如果要使用最新版那么我们需要重新下载再添加到项目中,无疑带来一些繁琐的麻烦,那么现在这里就有一款能解决 ...

  7. The Apache Tomcat Servlet/JSP Container

    1.Tomcat部署的场景分析 通常,我们对tomcat单机部署需求可以分为几种: 单实例单应用 (一个tomcat 一个web应用) 单实例多应用 (一个tomcat多个应用) 多实例单应用 (多个 ...

  8. linux下mysql的权限设计总结

    1,进入mysql,终端中输入 mysql -u 用户名 -p   .enter键后,提示输入密码. 2,执行grant all privileges on xxxdb.* to usertest@& ...

  9. nginx+django线上部署

    (一):背景在线 由于现在工作的需要,我需要使用Python来进行一个网站后台的开发,python之前接触过其语法的学习,基本的东西已经掌握,但是当时自学的时候是学得python3.5,而现在要使用p ...

  10. JZOJ 4743. 积木

    Description Input Output Sample Input 38 7 63 9 41 10 5 Sample Output 18