简介:

  最近在工作中遇到一个问题,需要离线比较两张Mongodb表的差异:大小差异,相同的个数。

  所以,我将导出的bson文件转成了json文件(2G以上),一条记录正好是一行。

问题:

  因此我将以上问题转换成了比较两个(本例考虑多个)超大数组的交集!所以要求时间复杂度、空间复杂度应该尽可能的低!

降低内存:

  由于要将文件的每一行都读到内存里,如果行的长度比较大的话,内存肯定是不够的!

  所以我想到的办法是讲每一行压缩成md5编码。 String line = md5(line)。然后再将新的line读入内存。

  如此,通常1000万行记录读到内存里大概是800MB(这里有点忘了,反正大概是800MB~1GB)。

(我使用的idea编辑器,跟eclipse可能在某些地方有点差别。另外,本例一字符数组为例,并且假设数组元素不重复!!!)

MapReduce:

  1. /**
  2. * 这里以字符串数组为例
  3. * 采用mapreduce原理,生成一组以数组元素为key,相同元素的个数为value的中间键值对
  4. * 这里将mapreduce分开来写方便阅读,也可以写成一个函数
  5. * @param arrays
  6. */
  7. public static HashMap<String, Integer> mapReduce(final String[]... arrays) {
  8. HashMap<String, Integer> hashMap = new HashMap<>();
  9.  
  10. // 不要看到两个for就以为时间复杂度为n^2,这里只是有多个数组参数而已
  11. for (String[] array : arrays) {
  12. for (String elem : array) {
  13. if (hashMap.containsKey(elem)) {
  14. hashMap.put(elem, hashMap.get(elem) + 1);
  15. }
  16. else {
  17. hashMap.put(elem, 1);
  18. }
  19. }
  20. }
  21.  
  22. return reduce(hashMap, arrays.length);
  23. }

Reduce:

  1. /**
  2. * 统计出相同元素个数正好是数组(参数)个数的元素(也就是每个数组中都有的元素)
  3. * 移除value不等于数组参数个数的键值对,并组成新的map
  4. * @param hashMap
  5. * @param arrayCount
  6. * @return
  7. */
  8. public static HashMap<String, Integer> reduce(HashMap<String, Integer> hashMap, final Integer arrayCount) {
  9. Iterator<String> iter = hashMap.keySet().iterator();
  10. String key;
  11.  
  12. while(iter.hasNext()) {
  13. key = iter.next();
  14.  
  15. if (!hashMap.get(key).equals(arrayCount)) {
           // 不能使用 hashMap.remove(key); 会出现异常, 见http://www.cnblogs.com/yrqiang/p/5344531.html
  16. iter.remove();
  17. }
  18. }
  19. return hashMap;
  20. }

eg:

  1. /**
  2. * 本例假设同一数组中的元素不重复
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. HashMap<String, Integer> hashMap = new HashMap<>();
  7.  
  8. String[] arr1 = {"aa", "bb", "cc", "dd"};
  9. String[] arr2 = {"11", "bb", "cc", "dd", "ee"};
  10. String[] arr3 = {"22", "bb", "cc", "dd", "ee", "ff"};
  11.  
  12. hashMap = mapReduce(arr1, arr2, arr3);
  13.  
  14. System.out.println(hashMap);
  15. System.out.println(hashMap.size());
  16. }

【算法】求多个数组中的交集(Java语言实现)的更多相关文章

  1. SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  2. Problem N: 求二维数组中的鞍点【数组】

    Problem N: 求二维数组中的鞍点[数组] Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2764  Solved: 1728[Submit][S ...

  3. 求一无序数组中第n大的数字 - 快速选择算法

    逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) #include <v ...

  4. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  5. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  6. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  7. Task 4.5 求二维数组中的最大连通子数组之和

    任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将 ...

  8. 求一个number数组中的最大值和最小值的差

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  9. [PHP] 算法-二位有序数组中查找的PHP实现

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1.二 ...

随机推荐

  1. SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled

    SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled 今天是2013-09-17,在今天学习sql ...

  2. JQuery让input从disabled变成enabled

    JQuery让input从disabled变成enabled document.getElementByIdx_x("removeButton").disabled = false ...

  3. powerdesigner反向MySQL5.1数据库 生成ER图

    我用的powerdesigner是15.1版本,数据库是MySQL5.1.57 (1)首先新建一个“PhysicalDataModel”类型的文件,然后点击“Database”->"C ...

  4. Sql"列转行"三种方法对比

    SQL code------ 合并列值  --***************************************************************************** ...

  5. Java基础之垃圾回收

    /** * 对象在没有任何引用可以到达时,生命周期结束,成为垃圾. * 所有对象在被回收之前都会自动调用finalize()方法. * ******************************** ...

  6. codeforces 547B. Mike and Feet 单调栈

    题目链接 用单调栈计算出一个数字, 左边第一个比他小的数字的位置, 右边比第一个他小的数字的位置, 然后len = r[i] - l[i] +1. ans[len] = max(ans[len], a ...

  7. Ubuntu Server 14.04在VMware安装的一些事儿

    这几天一直在折腾Ubuntu Server 14.04,故记录下: 安装前的准备: 1.建议安装英文版,像15.04.16.04等安装中文版时存在bug,而且中文版字体显示也有问题. 2.Ubuntu ...

  8. Xcode GDB 命令list

    此文下半部分为转载:但是这里有一些我自己使用技巧,结合下面的文章,我们会有更多的收获,在此感谢原创者.     --------------------- 关于调试异常崩溃: 一般崩溃是由内存使用错误 ...

  9. php socket 超时设置

    1.php创建socket的方法和设置超时的方法,贴出来分享一下 //如果$waitAckSec=0,则返回成功发送的字节�? //如果$waitAckSec大于0,则返回发送后接收到得内容 //任何 ...

  10. 升级automake和autoconf

    <pre name="code" class="html">zjtest7-redis:/root/soft/json-c-json-c-0.12- ...