当前位置:编程学习 > JAVA >>

一道大数据量算法的面试题,有兴趣的给点思路

题目:在500000个html文件中存在电话号码,请将电话号码无重复提取出来。

分析:
A、提取
B、去重:BitMap,BloomFilter

难点:提取该如果做呢? 大数据,面试,bloomfilter --------------------编程问答-------------------- 按行读取,然后用正则把电话号码取出来 --------------------编程问答--------------------
引用 楼主 zhb8015 的回复:
题目:在500000个html文件中存在电话号码,请将电话号码无重复提取出来。

分析:
A、提取
B、去重:BitMap,BloomFilter

难点:提取该如果做呢?
              
                  大数据,面试,bloomfilter

BitMap,BloomFilter这两个是什么类,api里面没查到
就是正则提电话吧,然后用个线程安全的Set来保存,这样可以多线程读取 --------------------编程问答-------------------- 之前网上看到的:
给你一堆西安市的电话号码列表,数量大概在千万级,

要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。

目前西安市的电话号码大概都以8开头,为8位,也就是

类似于82678578这样子

二重暴力搜索时间复杂度太高,这里我们不予考虑。

容易想到的办法就是建立一个标志数组,

int boolean都行,用相应的位置值来代替这个号码是否出现,

根据数组的可直接存取特性,来提高效率。

但是你是否想过或测试过

int[] a = new int[100000000];

boolean[] a = new boolean[100000000];

这样类似的语句是否可以通过编译并且执行。

再仔细思考下,就会发现,int型的字段太过于占空间,我们只需要知道这个号码存在与否,

所以最简单的0和1就够用了,能表示0和1的最小存储单位是什么呢?

是内存中的一位。

OK,这就是bitmap的思想。

将西安市的电话号码去掉开头的8,就可以将其映射到一个1到10000000的数组中。

8bit是1byte,1024byte是1kb,1024kb是1mb

所以10000000个bit占用的空间为

10000000/8/1024/1024mb大概为1mb多些,

这对于现在大家动不动几G的内存来说,完全是小菜一碟。

同时,java中也有对应的实现,java.util.BitSet。


我个人看法是提取号码用IO流实现,然后构建一个BitSet数组,

        //创建一个具有11位的bitset 初始所有位的值为false  
        java.util.BitSet bitSet = new java.util.BitSet(10000000000);  
        // 依次将读取到的号码在bitset中的位置值设为true  
        bitSet.set(134XXXXXXXX, true);
        // 设置完后,再获取为true的号码。

 // 没试验过,有错误请大家指正。。 

补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,