杂谈记录——论Long类型的大数据量求交集
一、优化内外层比较的结构
『外层遍历 + 内层遍历』查找:
复杂度 O (NM) ,一般使用 contains () 检查是否包含
『外层遍历 + 内层 Hash』查找:
复杂度 O (N),一般将内层 List 转化为 HashSet 实现
『外层遍历 + 内层 bitMap』查找:
复杂度 O (N),一般将内层 List 转化为字节映射实现
package com.jw.demo.com.colllection.test;import org.junit.Test;import java.util.*;public class SetOperation {@Testpublic void setOperation() {int size = 5000000;HashSet<Long> la = new HashSet<>(size);HashSet<Long> lb = new HashSet<>(size);for (int i = 0; i < 300000; i++) {la.add(Long.valueOf(i));}for (int i = 0; i < 300000; i++) {lb.add(Long.valueOf(i));}System.out.println("2.『外层Hash+内层list』查找:");outHastSetInnerHashSet(la, new ArrayList<>(lb));System.out.println("重复的数据有:"+la.size());//『外层list+内层Hash』查找:System.out.println("2.『外层list+内层Hash』查找:");outArrayListInnerHashSet(new ArrayList<>(la), lb);System.out.println("重复的数据有:"+la.size());System.out.println("2.『外层Hash+内层Hash』查找:");outHashSetInnerHashSet(la,lb);System.out.println("重复的数据有:"+la.size());receiveDefectList(new ArrayList<>(la),new ArrayList<>(lb));}// 外层:HashSet,内层:HashSetprivate void outHastSetInnerHashSet (HashSet<Long> listA, List<Long> listB) {long begin = System.currentTimeMillis();HashSet<Long> setB = new HashSet<>(listB);listA.retainAll(setB);
// System.out.println("重复的数据有:"+listA.size());long end = System.currentTimeMillis();System.out.println("[HashSet-ArrayList]RetainAll耗时:" + (end - begin));}// 外层:ArrayList,内层:HashSetprivate void outArrayListInnerHashSet(List<Long> listA, HashSet<Long> listB) {long begin = System.currentTimeMillis();ArrayList<Long> setA = new ArrayList<>(listA);Set<Long> set = new HashSet<>();Long[] arr = set.toArray(new Long[set.size()]);Arrays.sort(arr);setA.retainAll(listB);
// System.out.println("重复的数据有:"+setA.size());long end = System.currentTimeMillis();System.out.println("[ArrayList-HashSet]RetainAll耗时:" + (end - begin));}private void outHashSetInnerHashSet(HashSet<Long> la, HashSet<Long> lb) {long begin = System.currentTimeMillis();la.retainAll(lb);
// System.out.println("重复的数据有:"+la.size());long end = System.currentTimeMillis();System.out.println("[HashSet-HashSet]RetainAll耗时:" + (end - begin));}private void receiveDefectList(List<Long> firstArrayList, List<Long> secondArrayList) {long begin = System.currentTimeMillis();List<Long> resultList = new ArrayList<Long>();LinkedList<Long> result = new LinkedList<Long>(firstArrayList);// 大集合用linkedlistHashSet<Long> othHash = new HashSet<Long>(secondArrayList);// 小集合用hashsetIterator<Long> iter = result.iterator();// 采用Iterator迭代器进行数据的操作while(iter.hasNext()){if(othHash.contains(iter.next())){iter.remove();}}resultList = new ArrayList<Long>(result);firstArrayList.clear();resultList.forEach(o-> firstArrayList.add(o));long end = System.currentTimeMillis();System.out.println("[ite-iterator]RetainAll耗时:" + (end - begin));}private void test3(List<Long> array1,List<Long> array2){Set<Long> set = new HashSet<>();Long[] arr = set.toArray(new Long[set.size()]);Arrays.sort(arr);// 通过HashMap:求两个集合中交集Map<Long,Integer> map=new HashMap<>();for(int i=0;i<Math.min(array1.size(),array2.size());i++){contains(map,array1.get(i));contains(map,array2.get(i));}// 遍历for(Map.Entry<Long, Integer>m:map.entrySet()){if(m.getValue()>1)array1.remove(m.getKey());
// System.out.println(m.getKey());}}private void contains(Map<Long,Integer>map,Long k){if(map.containsKey(k)){Integer tmp=map.get(k);tmp++;map.put(k, tmp);}else{map.put(k,1);}}}
二、java交集retainAll 和 Sets.intersection 性能比较(链接)
三、用JDK方法求交集retainAll(链接)
四、利用guava集合求交集(链接)
五、利用bitmap求两个list的交集(链接)
jar包获取地址(点击)
参考链接
1、十万以上数据的两个集合进行交集,差集运算,ArrayList为什么特别慢?HashSet为什么效率如此高?(地址)
2、Java 中大集合 求交集的方法比较(地址)
3、bitmap技术解析:redis与roaringBitnap(地址)
4、一文读懂比BitMap有更好性能的Roaring Bitmap(地址)
杂谈记录——论Long类型的大数据量求交集相关推荐
- 大数据集合求交集_通达信北上资金+盘面分析sp版面,智能大数据集合,筹码占比指标...
大家好,我是金融依依. 最近一直都在给大家分享一些比较实用的sp界面,因为发现很多人了解信息的渠道是非常乱的,很多时候得到的信息还不一定准确,很多界面看的自己眼花缭乱,最后也没能看出个123,所以今天 ...
- 大数据集合求交集_Java8 实现ArrayList求交集并集差集
本文借助Java8的Stream API完成ArrayList集合运算:求交集.并集和差集! public class CollectionUtil {/*** 判断为空*/public static ...
- 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?
犹记得老师敲着黑板,强调"集合"的特性:无序.不重复,没想到多年后在咱们编程中派上了用场. 集合 # 数据分析中,经常需要把字符串.列表中的数据去重,怎么办呢?用"集合& ...
- Mybatis 大数据量的批量insert解决方案
前言 通过Mybatis做7000+数据量的批量插入的时候报错了,error log如下: , ('G61010352', '610103199208291214', '学生52', 'G610103 ...
- 后端技术杂谈12:捋一捋大数据研发的基本概念
你了解你的数据吗(开篇) 转自http://www.mdjs.info/2018/03/05/data-warehouse/concept-of-dw/ 0x00 前言 你了解你的数据吗? 前几天突然 ...
- mysql scrapy 重复数据_MySQL大数据量表中删除重复记录
MySQL大数据量表中删除重复记录 最近工作中需要抓取大量新闻,抓取的数据中由于一些原因存在一些重复数据,而整个数据表的记录数接近10万条,大小接近1个G,又在我自己的渣渣本本上,查询速度十分不理想, ...
- .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页.延迟执行和日志记录 作者:webabcd 介绍 以Northwind为示例数据库,DLIN ...
- MySQL数据库如何解决大数据量存储问题
FROM http://blog.csdn.net/likika2012/article/details/38816037 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存 ...
- Oracle大数据量分页通用存储过程
type refCursorType is REF CURSOR; --游标类型定义,用于返回数据集 /*********************************************** ...
最新文章
- 在windows下配置pthread多线程
- 豪取4个SOTA,谷歌魔改Transformer登NeurIPS 2021!一层8个token比1024个还好用
- 数据分析工具Pandas(7):数据清洗、合并、转化和重构
- id ajax,AJAX_ajax.js里面有内容显示效果,根据ID,ajax.js里面有内容显示效果,根 - phpStudy...
- 16位和32位微处理器(4)——Pentium的寄存器及相关机制
- Spring : Spring 切面优先级
- Java基础篇:简单介绍一下final
- 用JavaScript来写浏览器上的应用
- BIOS、BootLoader、uboot对比
- python3计算运行时间_性能分析之代码运行时间计算——Python timeit 模块 介绍
- C++ Lib的生成与调用 生成dll,lib快速的寻找方法
- mysql 5.7插入很慢_MySQL进阶——主从复制
- 挑战性题目DSCT102:木板切割问题
- 5.5matlab曲线拟合(多项式函数拟合)
- android h5 qq登录,Android webview一键登录手机QQ(2018.11)
- 什么是负载?如何查看服务器的机器负载情况?
- Druid (大数据实时统计分析数据存储)
- LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”的原因又一例
- 美团点评2017校园招聘编程题--取红包
- 赶紧收藏3个免费在线资源齐全的网站
热门文章
- Flask 自定义命令 类似于django的manage.py
- 构建 bilibili 的自动化管理
- stm32-通用定时器原理及代码分析
- JS打砖块小游戏 canvas绘制
- [摘要生成]Boosting Factual Correctness of Abstractive Summarization with Knowledge Graph
- Preferences DataStore使用实例
- python代码运行助_【分享】中午吃什么,Python摇一摇代码帮助你 | 勤奋的小青蛙...
- sql yog出现2013错误
- (设计模式四)java设计模式之建造者模式
- 2021-03-20 Codeforces Round #708 (Div. 2)