分治:hash + 堆 归并 快排 处理大数据

一、寻找热门查询,300万个查询字符串中统计最热门的10个查询。

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

  • 每一个查询串为255Byte,4个为1k
  • 那么总共有1千万个请求,300w个请求3m
  • 3m*1k/4 = 0.75G 所以内存不会超出

所以是典型的TopK问题:

二、hashmap + 堆

1.hashmap进行域名统计,key为请求域名,value为请求的次数,每次判断是否存在key,存在就将value值加1,否则添加项,并将value设置为1.时间复杂度为o(n),l为数据大小

2.维护一个k大的小顶堆,遍历key(实质是去重后的域名),比堆顶小的舍去,比堆顶大的添加,并调整堆,调整时间o(log(k)) k为传入参数。 时间复杂度为n1*log(k),n1为去重后的数据大小。

三、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

由于内存的限制,所以不能同时将1G的文件进行分析计算,可以采用分治思想,将文件分为多个,可以分为每一个只有1M的,这样对小文件的计算就不会出现超出内存的问题。

  • 分割的方法是将每一个单词进行hash后,hash%5000这样将单词分割到5000个小文件中,1G/5000 大约一个文件200k,重复单词一定被分割到同一个文件中。
  • 由于每一项是一个单词,可以采用字典树Trie进行统计/hashmap,统计每一个文件中出现的次以及频率。字典树的时间复杂度为单词最长的数值+遍历一遍n*O(k),hash为遍历一遍+产生hash+冲突解决。
  • 对每一个小文件取出其中频率最大的前100个单词,然后进行合并,或者直接进行归并排序/堆排序,nlog(k)
四、海量日志数据,提取出某日访问百度次数最多的那个IP。

海量文件很容易内存溢出,我们必要的操作步骤为:

1.分治,切割为小文件

2.hash 进行词频统计

3.堆排序,取出前k大

扫描日志文件,对每条访问的IP地址作hash,然后取模,比如(%1000),则把整个大日志文件映射为1000个小文件(同一个IP地址总是被映射到同一个小文件中)。再找出每个小文中出现频率最大的IP(可以采用hash_map对那1000个文件中的所有IP进行频率统计,然后依次找出各个文件中频率最大的那个IP)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

五、海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。

在这种情况下,很明显可以使用MapReduce的方法,但是如果不使用集群,又该怎么办呢?

  • 首先我们可以对每一个文件进行堆排序,求出每一个文件的前10数据,
  • 再把100台电脑上的数据合并起来再用堆排序求出top前10.
  • 但是这样存在很大的问题,就是如果相同的数据分布在不同的主机,这样可能会导致前100求前10不准确问题。我们可以先将文件合并,在通过hash%100产生100个文件分布在100个机器上,这样相同的数据都会位于一台电脑上。
六、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
  • 可以采用边读边写顺序的读取10个文件,并将每一个请求域名进行hash%10存放到对应的文件中

  • 然后采用hash_map对每一个文件域名的量进行统计

  • 对所有的输出结果进行合并,并使用快排/堆/归并进行排序,排序的复杂度为nlogn

  • 如果数据的重复量是比较大的,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

  • 同时也可以直接使用MapReduce来进行分析。

七、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件url列表的交集?
  • 首先估计每一个文件的大小,50亿 条数据 每条数据64Byte, 5G * 64 = 320G所以是不可能一次性的加载到内存中需要采用分治的思想。
  • 首先对每一个url进行hash映射,hash%1000分割到一千个文件中进行存储,每一个文件的大下为300M,然后对另一个文件进行相同的分割,这样数据相同的都被分割到相同的文件中。
  • 然后将一个小文件的数据存储到hash_set中,然后遍历另一个文件的数据往hash_set中丢,如果存在则表明是共同拥有,然后输出到文件中。
八、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

首先我们给出答案:

1.         建立Trie树,记录每颗树的出现次数,O(n*le); le:平均查找长度

2.         维护一个10的小顶堆,O(n*lg10);

3.         总复杂度: O(n*le) + O(n*lg10);
九、1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
  • 用trie树/hash_map,将统计次数不唯一的直接过滤(filter)到即可。

  • 如果数据量很大处理会很不项式,可以采用分治的思想,将文件想用hash%1000进行分割,然后在对每一个文件的字符串进行统计,最后再进行过滤。

十、100w个数中找出最大的100个数。
  • 因为是数字所以可以采用的方法就比较多,比如之前提到的堆排序,维护一个100大小的堆,将其他数据与堆顶进行比较。
  • 或者采用分治思想的快排,每次排序会确定一个数据的位置,如果数据的大小未接近100,就将数据小的部分直接舍去即可。直到数据接近100时,再采用堆/插入等进行排序。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 7,403评论 1 39
  • 第一部分:十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 IP的数目还是有限的,...
    小道萧兮阅读 972评论 0 4
  • 漂泊在外的日子里常有千万思绪翻腾,总倾泻不完,似流浪的诗人般风情万种。到家之后这位诗人活生生被封印都不带挣...
    Dissing阅读 243评论 0 0
  • 见过了南方的骄阳 也见过北国的飞雪 想去抚摸西边的山脉 也想仰望东边的高楼 如果可以 我想从南走到北 再跟你说我看...
    Ritapy阅读 228评论 0 0
  • 故乡的村子现在想来其实是很大的,棋盘一样分为东西两个村落,中间一条大道连接成一片红瓦起脊的屋顶,一家一户的前后左右...
    Mikey米客阅读 260评论 0 2