海量数据处理学习笔记

一:数据处理常见方法:hash方法、bit-map法(位图)、bloom filter(布隆过滤器)、数据库优化法、倒排序索引法、外排序索引法、tire树、堆、双层桶排序、mapreduce。

二:hash法

hash一般称为散列,是一种映射关系。构建散列表需要设定一个散列函数,加油设定一个冲突处理方法。冲突处理主要有:开放地址法(当地址发生冲突时,按照固定函数在散列,知道找到空闲位置)链地址法(设置指针组ch【m】,所有散列地址为i的数据元素都插入到头指针为策划ch【i】的链表中)再散列法(在散列冲突使用第二个、第三个。。。直到无冲突)建立公共溢出区。

hash主要是用来进行“快速存取”,在o(1)的时间复杂里,可以查找到元素,或者判断元素是否存在。

三、bit-map法

例题:从八位号码中找出重复号码,或删除重复号码。8位数字最多可以表示99999999个号码,每存储一个号码占用一个bit位,则需要99mbit,12.75MB就可以存储。例如,00000123的号码,把第123位置为1,当位为1时输出改位当前下标,则得出改信息。

三:blooom filter法

bloom filter的基本思想是位数组和hash函数的联合使用。包涵一个m位的位数组,初始化为0,定义k个不同的hash函数,每个函数为映射到一位。置为1,查询某元素是否存在时,检测该k个位是否全部为1。特点:检测不存在一定不存在,检测存在不一定存在。有可能是其他元素的置位复合而成的。

四:倒排索引法

正向索引文档占据了中心位置,每个文档指向一个他所包含的索引项的序列。例如,文档指向了它包含的那些单词,反向索引则是单词指向了包含他的文档。倒索引的优点是在处理复杂的多关键字查询时,可以在倒排表中先完成查询的交并等逻辑。

五、外排序法

在待排数量打的时候,在内存中不能一次处理,可以以文件的形式存在外存中,排序的时候一部分一部分调入内存排序。

六、tire树(字典树 或者键树)

用于快速字符串检索的多叉树结构,利用公共前缀来减少时间的开销,以空间换时间。一般采用26叉树进行组织。例如求解兄弟单词。

import java.util.*;
public class trietree {

    public trietree() {
    }
    class TireNode{
        Vector<String> bwords=new Vector<String>();
        TireNode[] next=new TireNode[26];
        TireNode()
        {
            for(int i=0;i<26;i++)
            {
                next[i]=null;
            }
        }
    };
        void InsertNode(TireNode root,String word)
        {
            if(word.length()==0)
            {
                return ;
            }
            if(root==null)
            {
                root=new TireNode();
            }
            int i=0;
            char [] sword=word.toCharArray();
            Arrays.sort(sword);
            TireNode next=root;
            while(i<word.length())
            {
                if(next.next[sword[i]-'a']==null)//如果当前节点的sword【i】位置的字母不为空,则已经存在,不为空则不存在该字母,则添加
                {
                    TireNode nnext=new TireNode();
                    next.next[sword[i]-'a']=nnext;
                }
                next=next.next[sword[i]-'a'];
                i++;
            }
            next.bwords.add(word);//把每一个节点有的单词加进来,大大减低时间复杂度
        }
        boolean SearchNode(TireNode root,String word)
        {
            char [] sword=word.toCharArray();
            Arrays.sort(sword);
            int i=0;
            while(i<word.length())
            {
                if(root.next[sword[i]-'a']!=null)
                {
                    root=root.next[sword[i]-'a'];
                    i++;
                }
                else
                {
                    break;
                }
            }
            if(i==word.length())
            {
                for(int j=0;j<root.bwords.size();j++)
                {
                    System.out.print(root.bwords.get(j)+" ");
                }
                System.out.println();
                return true;
            }
            return false;
        }
        public void findbrother()
        {
            TireNode root=new TireNode();
            InsertNode(root,"hehao");
            InsertNode(root,"ehaoh");
            InsertNode(root,"haohe");
            InsertNode(root,"aoheh");
            InsertNode(root,"et");
            InsertNode(root,"eh");
            InsertNode(root,"oheha");
        }
    public static void main(String[] args) {
        // TODO code application logic here
        new trietree().findbrother();
    }
 
}

七、双层桶排序

双层桶不是一种数据结构,而是一种类似于分治思想的算法思想。元素范围很大,所以通过多次划分,逐步确定范围。桶排序的基本思想是把【0,1)划分为N个大小相同的子区间,每个区间是一个桶,然后将N个记录放入桶中,例如排序0~99的数,划分为10个区间即0~9、10~19、20~29。。。90~99,然后在每个小区间里面排序。通常由大桶组外接小桶链组成。

八、mapreduce法

核心操作是map(映射)和reduce(化简)map函数独立地对每个元素进行操作,把一组键值对映射成一组新的键值对,通过map程序将数据切割成不同的块,分配给大量计算机处理达到分布式的下过。然后通过指定并发的reduce函数将结果汇总。

九、top-k问题

 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树活着Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。

例如有一亿个浮点数找出其中最大的10000个。

第一种将数据全部排序,第二种局部淘汰法,建立空间为10000的数组,如果有更大的数就替换,第三种分而治法,用hash分成100份,每一份取出前10000个大数,之后合并操作再排序。第四种hash法,先去除重复数据,减少内存。第五种,采用最小堆。用mapreduce很适合。

重复问题,排序问题用bit-map位图法,把数据置位,按顺序输出存储位置,即排序之后的数据。统计不同号码的数量,bit-map直接过滤。

十、堆的实现

堆排序是一种选择排序,整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。其中构建初始堆经推导复杂度为O(n),在交换并重建堆的过程中,需交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。所以堆排序时间复杂度一般认为就是O(nlogn)级。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值