zoukankan      html  css  js  c++  java
  • 算法——(1)大数据算法

    一、基本概念:

    1. Hash函数

    通过哈希函数,将输入域(可以是非常大的范围)指定到一个固定范围的输出域s上。

    具有四大性质

    1. 拥有无限的输入域

    2. 如果输入值相同,返回值一样

    3. 如果输入值不相同,返回值可能相同,可能不同

    4. 不同输入值得到的哈希值,整体均匀的分布在输出域s中——优秀哈希函数的判断。

    经典算法:MD5、SHA1

    2. 一致性哈希算法

    例如,服务器集群中,如果目前的机器数为N,如果使用取余的哈希算法中,一旦增减或减少一台机器,则所有的数据都要重新取余计算器对应的机器。

    一致性哈希算法特点

    将HASH函数计算后得到的数据当作一个环,每个数据和每台机器都对应在环上的一个位置,对于一个数据来说,找到它分属的机器,就是以它自己为起点,在环上顺时针找到离它最近的机器即可。

    所以增减、迁移数据的代价很小。

    3. Map/Reduce

    Map:把大任务利用HASH分成若干小任务,在机器中运行

    Reduce:将小任务得到的结果并发处理,得到最终的结果

    4. 解题套路——词频统计

     1. 根据内存的限制,对整个数据根据哈希函数分配到不同的机器上/或者分流。

    例如:如果数字是0~232,内存限制是10M,则意味着每个区域最大的范围是:10M,所以所需要的分区数是:232/10M= 64

    2. 在每个分区上根据bitmap,对每个数据进行词频统计

    对于bitmap,每一位只能有0/1,第k-1位代表的就是数字k是否出现

    例如:对于0~232范围内的数据,只需要长度为232的bit数组,也就是:128M

    3. 如果要选出TOP-K,则利用最大堆/最小堆

    4. 综合所有分区,得到结果。

    二、遇到的题目:

    1. 统计一篇文章中每个单词的词频

    (1)预处理——抓取全部有效单词

    • 去掉标点符号
    • 补全缩写字母
    • 连词处理(换行)
    • 大小写处理

    (2)利用Map:生成每个单词词频为1的记录:(dog, 1)、(pig, 1)、(dog,1)——>可能有重复

    通过hash函数得到每个单词的哈希值,根据哈希值分配成若干组。——相同单词一定分在一个组

    (3)在每个分组中,利用reduce单词记录合并。最后再将所有的单词记录合并。

    2. 对10亿个IPV4的地址进行排序,每个Ip只出现一次

    1)申请一个128M的bitmap,在bitmap中每个位置对应的值只能是0/1代表出现/不出现

    2)将ipv4地址——>整数,如果出现在相应的bitmap中的位置设为1

    3)遍历bitmap,得到未出现的数字

    3. 对10亿人的年龄进行排序

    基数排序

    4. 有一个包含20亿个全部是32为整数的大文件,在其中找到出现次数最多的数,但是内存限制为2G

    1)根据内存限制进行分区。

    20亿/2G = 16个

    2)在每一个区间内,使用hash表统计词频,选出词频最多的数

    3)综合每个分区的词频第一,得到最终的第一。

    5. 32位无符号函数的范围:0~4294967295.现在有一个包含了20多亿个无符号整数的文件,在无符号范围内找到一个未出现的数,内存<10M

    1)根据内存限制,对232差不多42亿个数字,进行分组:

    分组个数:232/10M =64

    2)若一个分区词频的数字<它的长度,则代表有缺失

    3)在这个有缺失的分区,利用bitmap找出缺失的那个数

    6. 从百亿词汇中,找到最热的100个词

    1)根据哈希函数,分流到各个机器,如果每台机器的内存不够,则进一步分流到分区中

    2)在每个可处理的最小分区中,利用hashmap统计词频

    3)在每个分区中,利用最小堆选出TOP100

    4)综合所有,利用外排序/最小堆得到最终的TOP100

  • 相关阅读:
    TCP/IP四层模型
    Java中equals和==的区别
    最全前端资源汇集
    (转)php面向对象学习笔记
    学习内容
    Gulp入门教程
    seajs的CMD模式的优势以及使用
    正则
    Grunt
    Javascript 异步加载详解
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/6566987.html
Copyright © 2011-2022 走看看