一,什么是topK问题?

一组数据中,需要找出前k大(小)的数据

二,思路分析:以前k小为例

思路1:先排序再输出

如果是完全有序,那么输出所求数据很简答了(需要排序,将数据完全排序

思路2:基于快排,分片,不完全排序

使用快排思想,不断分片,左侧是比基准小的元素,右侧是比基准大的元素,

令 index=基准元素下标

a, index<k  说明第k小元素在index右侧,在index右侧寻找新的基数,直到基数的下标index==k

b,index==k   说明第k小元素就是基准元素

c,index>k  说明第k小元素在index左侧,在index左侧寻找新的基数,直到基数的下标index==k

三.另一种思路

数组长度为n,需要找出topk 小

那么将数组分为两部分

result=[0,k-1],

search=[k-1,n]

将result中的元素挨个与search中比较,如果result小于serch,数据交换

时间复杂度:

k*(n-k)

三,实现 java代码实现:

 public static  int  topK(int [] array,int k) throws Exception {if(null==array||array.length==0){throw new Exception("数组不能为空!");}if(k>array.length||k<=0){throw new Exception("k 范围不合法");}//开始处理快排:如何找基准数?基准数的大小越靠中间越好int middleIndex=getMiddle(array,0,array.length-1);while(middleIndex!=k){
//去右侧找新的基数位置if(middleIndex<k){middleIndex=partion(array,middleIndex+1,array.length-1);}else{
//去左侧找新的基数位置middleIndex=partion(array,0,middleIndex-1 );}}return array[middleIndex];}

partion方法实现:

 目的是将 left 这个元素(假设为m)(from位置的元素)放到区间from-to 之间合适的位置

使得 m 元素的左边全是比它小的,右边全是比它大的

最后返回这个middle元素的新的位置,如果恰好是k,那么恭喜,已经实现topk

 // 这也是快排中的分片函数
int  partion(int []input,int left,int right){if(left>=right){return -1;}int  keyValue=input[left];while (left<right){// 从右往左找到比key  大的数while (left<right &&  input[right]<keyValue ) {right--;}if(left<right){ // 大数放到高位input[left]=input[right];}// 从左往右找到比key小的数while ( left<right &&  input[left]>=keyValue) {left++;}if(left<right){// 小数放到低位input[right]=input[left];}}// 注意退出循环是:left==right// 如果input[left]>keyVal  ,则需要将keyVal放到left,left 元素放到keyPosinput[left]=keyValue;return left;}

附上产生随机数组代码

/**
*@author wangwei
*@created 11:17 2018/9/8*@classname RandomUtil
*@classdescription  随机数生成工具类
*
*/
public class RandomUtil {/*** * @param size   随机数组容量* @param max    随机数最大值* @return    随机数组*/public static int []  buildArray(int size, int max){int []array=new int[size];for(int i=0;i<size;i++){array[i]= (int) (Math.random()*max)%max;}return array;}public static void main(String[] args) {System.out.println( RandomUtil.buildArray(20,100).toString());}
}

测试代码:

 public static void main(String[] args) throws Exception {final int k=4;int  [] array= RandomUtil.buildArray(10,20);showArray("before topK",array);System.out.println("第"+(k+1)+"小值:"+topK(array,k));showArray("after topK",array);}public static  void showArray(String info,int  []array){System.out.println(info);for(int  item:array){System.out.println(item);}}

测试结果:

这是一次测试结果:注意的是,基准之前的元素并不保证是否有序,只是保证其比基准元素小,基准之后的元素同理

before topK
14
4
3
3
6
6
3
13
11
6
第5小值:6
after topK
3
4
3
3
6
6
6
13
11
14

在partion 的基础上实现快排就很简单了

 void quickSort(int array[],int from,int to){int mid=partion(array,from,to);if (mid!=-1){quickSort(array,from,mid-1);quickSort(array,mid+1,to);}}

topK问题分析与实现相关推荐

  1. 海量数据——TopK问题

    TopK问题是一个经典的海量数据处理问题,比如微博热搜每隔10分钟都会更新出排行前10的热门搜索信息,再或者通过大数据找出一个地区最爱吃的水果等,都可以使用TopK问题来解决,其核心思想就是最小堆的引 ...

  2. 【算法设计与分析】排序算法性能分析

    github:项目地址 一.实验目的 掌握选择排序.冒泡排序.合并排序.快速排序.插入排序算法原理 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性. 二.实验概述 排序问题要求 ...

  3. CTO 深度解读 SMTX OS 3.5 产品特性

    注:本文内容整理自 SmartX CTO 张凯在 SMTX OS 3.5 新品发布会上的演讲. 我们最近发布了一个很重要的产品版本--SMTX OS 3.5,在这里为大家做详细的介绍.在此之前,先简单 ...

  4. 用Python分析深圳程序员工资有多高?

    来源:zone7 概述 前言 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 最近各大一二线城市的房租都有上涨,究竟整体上涨到什么程度呢?我们也不得而知,于是乎 zone 为了一探究竟 ...

  5. python实现简单的情感分析

    python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.cs ...

  6. jieba tfidf_【NLP】【三】jieba源码分析之关键字提取(TF-IDF/TextRank)

    [一]综述 利用jieba进行关键字提取时,有两种接口.一个基于TF-IDF算法,一个基于TextRank算法.TF-IDF算法,完全基于词频统计来计算词的权重,然后排序,在返回TopK个词作为关键字 ...

  7. bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云

    1.分析网页 视频地址: www.bilibili.com/video/BV19E- 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...

  8. 【Prometheus + Grafana】 使用 topk 在 grafana 绘制 前 n 个时间序列

    文章目录 项目场景: 问题描述: 原因分析: 解决方案: 设置bps,在模板中使用变量,即 Variables 使用 bps 变量和prometheus 的正则表达式查询 优化界面 项目场景: 获取流 ...

  9. python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况

    公众号文章链接 第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势. 用到一下库: re正则,matplo ...

最新文章

  1. linux进程间通信:system V 共享内存
  2. html-webpack-plugin插件 根据模板生成多页面
  3. 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)
  4. C语言中,宏和全局变量的区别是什么?
  5. [EDA] 2.2 简单PLD结构原理-潘松版
  6. 使用 Arduino 和 LM35 温度传感器监测温度
  7. Django第二天笔记
  8. java 64内存不足_请教一个 Java 内存占用的问题
  9. python设计模式9-装饰器模式
  10. notepad2正则表达式替换字符串
  11. 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像
  12. SQL数据库置疑修复说明文档
  13. 如何在Internet Explorer中使用VARCHART XGantt控件?
  14. CIO40:IT人22-30岁职业规划
  15. Zynga的数据分析
  16. java publisher_Publisher/Subscriber(发布/订阅者)消息模式开发流程
  17. 计算机考研前沿知识怎么准备,2016考研复试面试前需充足准备9大内容
  18. 投影机检测不到计算机信号,投影仪搜索不到信号源怎么办?这几种操作方法可进行修复...
  19. html中出现弹窗偏右,打印机打印某些网页时,右边总是打印不全,怎么办
  20. 对全职高手的自然语言处理

热门文章

  1. 月薪3000与月薪30000的文案区别
  2. H5性能测试以及H5性能测试工具
  3. vue手把手教你实现论坛bbs——(二)创建组件
  4. 无网情况下安装rpm依赖包
  5. 下载rpm离线安装包
  6. 波兰计算机专业大学排名,波兰留学大学排名
  7. 这5个免费音效素材网站,你一定要收藏好~
  8. Java 小项目 01 简单记账软件
  9. 【前端三件套——CSS基础】网页开发必备知识
  10. qq浏览器tv版 v1.0 官方版