搜索引擎热门查询统计

题目描述:
    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

分析:

这个问题在之前的这篇文章十一、从头到尾彻底解析Hash表算法里,已经有所解答。方法是:

第一步、先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计
    第二步、借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。
        即,借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆(K1>K2>....Kmin,Kmin设为堆顶元素),然后遍历300万的Query,分别和根元素Kmin进行对比比较(如上第2节思路3所述,若X>Kmin,则更新并调整堆,否则,不更新),我们最终的时间复杂度是:O(N) + N'*O(logK),(N为1000万,N’为300万)。更多详情请参考原文。

代码实现:

#include <stdio.h>
#include <stdlib.h> #define MAXLEN 100005
#define K 100 void Swap(int* a, int* b) {
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;
} void HeapAdjust(int array[], int i, int length) {
int child, temp;
for(temp = array[i]; *i+<length; i=child) {
child = *i+;
if(child < length- && array[child+] < array[child])
child++;
if (temp > array[child])
array[i] = array[child];
array[child] = temp;
}
} int GetMin(int array[], int length, int k) {
int min = array[];
Swap(&array[], &array[length-]); int child, temp;
int i=, j=k-;
for (temp = array[]; j> && *i+<length; --j,i=child) {
child = * i + ;
if (child < length - && array[child+] < array[child])
child++;
if (temp > array[child])
array[i] = array[child];
else
break;
array[child] = temp;
}
return min;
} void Kmin(int array[] , int length , int k) {
for(int i=length/-;i>=;--i)
//初始建堆,时间复杂度为O(n)
HeapAdjust(array,i,length); int j=length;
//k次循环,每次循环的复杂度最多为k次交换,复杂度为o(k^2)
for(int i=k;i>;--i,--j){
int min=GetMin(array,j,i);
printf("%d,", min);
}
} int main() {
int array[MAXLEN];
for(int i=MAXLEN; i>; --i) { // init array
array[MAXLEN - i] = i;
}
Kmin(array, MAXLEN, K);
return ;
}

ref: http://blog.csdn.net/v_JULY_v/article/details/6256463

http://blog.csdn.net/v_JULY_v/article/details/6403777

topK 算法的更多相关文章

  1. 关于堆排序和topK算法的PHP实现

    问题描述 topK算法,简而言之,就是求n个数据里的前m大个数据,一般而言,m<<n,也就是说,n可能有几千万,而m只是10或者20这样的两位数. 思路 最简单的思路,当然是使用要先对这n ...

  2. java TopK算法

    现有一亿个数据,要求从其中找出最小的一万个数,希望所需的时间和空间最小,也就是所谓的topK问题 TopK问题就是从海量的数据中取最大(或最小的)的K个数. TopK问题其实是有线性时间复杂度的解的, ...

  3. (转)基于快速排序的TOPK算法

    基于快速排序的TOPK算法 转自:http://blog.csdn.net/fanzitao/article/details/7617223 思想: 类似于快速排序,首先选择一个划分元,如果这个划分元 ...

  4. topk算法

    方法一 堆排序 自建堆 heapMax方法,从上至下调整堆 pop时,可以使用自上而下调整堆,调用heapMax(arr,0,sz-1); push时,需要自下到上调整即 从上到下调整: void h ...

  5. Python 实现转堆排序算法原理及时间复杂度(多图解释)

    原创文章出自公众号:「码农富哥」,欢迎转载和关注,如转载请注明出处! 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多 ...

  6. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  7. 大数据计算:如何仅用1.5KB内存为十亿对象计数

    大数据计算:如何仅用1.5KB内存为十亿对象计数  Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...

  8. HashTable和HashSet中的类型陷阱

    HashTable和HashSet中的类型陷阱 发现这个陷阱的起因是这样的:我现在有上百万字符串,我准备用TopK算法统计出出现次数做多的前100个字符串. 首先我用Hashtable统计出了每个字符 ...

  9. sdn测量论文简介

    Prelude: Ensuring Inter-Domain Loop-Freedom in SDN-Enabled Networks 来源:APNet: The Asia-Pacific Works ...

随机推荐

  1. package.json中配置浏览器

    "browserlist":[ ">=1%", "last 2 versions" ],

  2. java中Class.getResource用法(用于配置文件的读取)

    https://www.cnblogs.com/keyi/p/6282838.html ******************************************** 用JAVA获取文件,听 ...

  3. django配置超级管理员

    Admin站点管理: 概述: 内容发布:负责添加,修改,删除内容的 公告访问 配置Admin应用: 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.a ...

  4. 基于jQuery游戏网站焦点图轮播特效

    基于jQuery的一款游戏网站焦点图轮播特效.这是一款带进度条定时切换,带缩略图切换的jQuery网站焦点图代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <cente ...

  5. Spring高级装配(一) profile

    Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥 ...

  6. C语言 · 简单计算器

    算法提高 简单计算器   时间限制:1.0s   内存限制:512.0MB      问题描述 编程模拟计算器的加.减.乘.除功能,根据用户输入的运算符,对两个数进行运算.(要求switch语句) 输 ...

  7. [服务]Crontab和每隔10S执行一次

    转自:https://www.cnblogs.com/juandx/archive/2015/11/24/4992465.html linux下定时执行任务的方法  在LINUX中你应该先输入cron ...

  8. 让jQuery的ajaxFileUpload插件支持onchange事件

    ajaxFileUpload插件只能上传一次的BUG发现还不少人遇到,很不幸我也遇到的,使用后发现里面的坑还不少,在createUploadForm方法中有句 var newElement = jQu ...

  9. Java通过JDBC进行简单的增删改查(以MySQL为例)

    Java通过JDBC进行简单的增删改查(以MySQL为例) 目录: 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JD ...

  10. iOS开发小技巧 - runtime适配字体

    iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...