java使用bitmap求两个数组的交集
一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担。我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数组的交集
先实现一个bitmap
/**
* @Description:
* @author: zhoum
* @Date: 2020-01-23
* @Time: 10:49
*/
public class BitMap { private int[] sign = {0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,0x00004000,0x00008000,
0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x80000000}; private int[] arr ; private int capacity; public BitMap(int capacity) {
validate(capacity);
this.capacity = capacity;
this.arr = new int[(capacity>>5)+1];
} public void put(int k){
if ( k > capacity ){
throw new RuntimeException("k is greater than capacity");
}
validate(k);
int index = k >> 5 ;//当前数字应该存放的bucket索引
arr[index] = arr[index]|sign[k & 31]; } private void validate(int k){
if ( k <= 0 ){
throw new IllegalArgumentException(" capacity must be greater than zero");
}
} public int[] getMixed(BitMap bitMap){
int length = Math.min(bitMap.arr.length,this.arr.length);
int[] other = new int[length],me = new int[length];
System.arraycopy(bitMap.arr,0,other,0,length);
System.arraycopy(this.arr,0,me,0,length);
//借用集合的无固定大小来构建最后数组
List<Integer> result = new ArrayList<>();
for (int i = 0; i < length; i++) {
int k= other[i] & me[i];
for (int j = 1; j <= 32; j++) {
if ( ((k>>j)&1) == 1 ){
result.add((i<<5)+j);
}
}
}
if ( result.size() == 0 ){
return null;
}else {
int[] rs = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
rs[i] = result.get(i);
}
return rs;
} }
}
写一个main方法试验下
public static void main(String[] args) {
BitMap bitMap = new BitMap(1000){{
put(248);
put(5);
put(9);
put(12);
put(6);
put(13);
put(963); }};
BitMap bitMap1 = new BitMap(1000){{
put(248);
put(15);
put(13);
put(963);
put(5);
put(6);
put(9); }};
int[] mixed = bitMap.getMixed(bitMap1);
System.out.println(Arrays.toString(mixed)); }
得到有序结果
java使用bitmap求两个数组的交集的更多相关文章
- java用最少循环求两个数组的交集、差集、并集
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List ...
- Java实现 LeetCode 350 两个数组的交集 II(二)
350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入 ...
- Java实现 LeetCode 349 两个数组的交集
349. 两个数组的交集 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: num ...
- leetcode-350-Intersection of Two Arrays II(求两个数组的交集)
题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...
- (C#) 求两个数组的交集
基本上在面试的时候,会具体到两个int数组,或string数组.具体也就是讨论算法. 首先需要的是和面试的人确认题目的含义,并非直接答题. 然后,可以提出自己的想法,首先最快的是用linq { Lis ...
- js求两个数组的交集|并集|差集|去重
let a = [1,2,3], b= [2, 4, 5]; 1.差集 (a-b 差集:属于a但不属于b的集合) a-b = [1,3] (b-a 差集:属于b但不属于a的集合) b-a = [4 ...
- 用lua求两个数组的交集、并集和补集。
-- 克隆 function Clone(object) local lookup_table = { } local function _copy(object) if type(object) ~ ...
- js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
随机推荐
- 1、Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Apache NIFI
Add a.password file to chrome. Settings -> Advanced -> Security -> Manage Certificates -> ...
- Python记
在企业应用领域,Java或C#都是不错的选择.
- 中国城市区号脚本-mysql
中国城市区号 300个. SET NAMES utf8mb4; ; DROP TABLE IF EXISTS `citycode`; CREATE TABLE `citycode` ( `codeId ...
- SpringMVC:Controller配置总结
西部开源-秦疆老师:SpringMVC系列博客 , 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringMVC:Controlle ...
- 软件工程 实验一 Git版本管理
实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2) 熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git init git status指 ...
- mysql获取字段信息
SELECT TABLE_SCHEMA AS `databaseName`, TABLE_NAME AS `tableName`, COLUMN_NAME AS `columnName`, DATA_ ...
- js处理json字符串
后台输出的字符串为 res= {"result":"true","data":"提交成功"} 前台js无法转化成对象,需 ...
- DE1-LINUX运行
在官网下载.img文件:网址:http://download.terasic.com/downloads/cd-rom/de1-soc/linux_BSP/ 写入DE1_SOC_SD.img文件: 打 ...
- mybatis(六):设计模式 - 建造者模式