topK问题分析与实现
一,什么是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问题分析与实现相关推荐
- 海量数据——TopK问题
TopK问题是一个经典的海量数据处理问题,比如微博热搜每隔10分钟都会更新出排行前10的热门搜索信息,再或者通过大数据找出一个地区最爱吃的水果等,都可以使用TopK问题来解决,其核心思想就是最小堆的引 ...
- 【算法设计与分析】排序算法性能分析
github:项目地址 一.实验目的 掌握选择排序.冒泡排序.合并排序.快速排序.插入排序算法原理 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性. 二.实验概述 排序问题要求 ...
- CTO 深度解读 SMTX OS 3.5 产品特性
注:本文内容整理自 SmartX CTO 张凯在 SMTX OS 3.5 新品发布会上的演讲. 我们最近发布了一个很重要的产品版本--SMTX OS 3.5,在这里为大家做详细的介绍.在此之前,先简单 ...
- 用Python分析深圳程序员工资有多高?
来源:zone7 概述 前言 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 最近各大一二线城市的房租都有上涨,究竟整体上涨到什么程度呢?我们也不得而知,于是乎 zone 为了一探究竟 ...
- python实现简单的情感分析
python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.cs ...
- jieba tfidf_【NLP】【三】jieba源码分析之关键字提取(TF-IDF/TextRank)
[一]综述 利用jieba进行关键字提取时,有两种接口.一个基于TF-IDF算法,一个基于TextRank算法.TF-IDF算法,完全基于词频统计来计算词的权重,然后排序,在返回TopK个词作为关键字 ...
- bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云
1.分析网页 视频地址: www.bilibili.com/video/BV19E- 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...
- 【Prometheus + Grafana】 使用 topk 在 grafana 绘制 前 n 个时间序列
文章目录 项目场景: 问题描述: 原因分析: 解决方案: 设置bps,在模板中使用变量,即 Variables 使用 bps 变量和prometheus 的正则表达式查询 优化界面 项目场景: 获取流 ...
- python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况
公众号文章链接 第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势. 用到一下库: re正则,matplo ...
最新文章
- linux进程间通信:system V 共享内存
- html-webpack-plugin插件 根据模板生成多页面
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)
- C语言中,宏和全局变量的区别是什么?
- [EDA] 2.2 简单PLD结构原理-潘松版
- 使用 Arduino 和 LM35 温度传感器监测温度
- Django第二天笔记
- java 64内存不足_请教一个 Java 内存占用的问题
- python设计模式9-装饰器模式
- notepad2正则表达式替换字符串
- 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像
- SQL数据库置疑修复说明文档
- 如何在Internet Explorer中使用VARCHART XGantt控件?
- CIO40:IT人22-30岁职业规划
- Zynga的数据分析
- java publisher_Publisher/Subscriber(发布/订阅者)消息模式开发流程
- 计算机考研前沿知识怎么准备,2016考研复试面试前需充足准备9大内容
- 投影机检测不到计算机信号,投影仪搜索不到信号源怎么办?这几种操作方法可进行修复...
- html中出现弹窗偏右,打印机打印某些网页时,右边总是打印不全,怎么办
- 对全职高手的自然语言处理