一般来说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求两个数组的交集的更多相关文章

  1. java用最少循环求两个数组的交集、差集、并集

    import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List ...

  2. Java实现 LeetCode 350 两个数组的交集 II(二)

    350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入 ...

  3. Java实现 LeetCode 349 两个数组的交集

    349. 两个数组的交集 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: num ...

  4. leetcode-350-Intersection of Two Arrays II(求两个数组的交集)

    题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...

  5. (C#) 求两个数组的交集

    基本上在面试的时候,会具体到两个int数组,或string数组.具体也就是讨论算法. 首先需要的是和面试的人确认题目的含义,并非直接答题. 然后,可以提出自己的想法,首先最快的是用linq { Lis ...

  6. 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 ...

  7. 用lua求两个数组的交集、并集和补集。

    -- 克隆 function Clone(object) local lookup_table = { } local function _copy(object) if type(object) ~ ...

  8. js取两个数组的交集|差集|并集|补集|去重示例代码

    http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...

  9. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

随机推荐

  1. 安装proxmox VE(PVE)教程

    proxmox VE,又叫PVE,全称是 Proxmox Virtual Environment 官网地址:https://www.proxmox.com/en/ 1)在官网下载PVE最新镜像,笔者下 ...

  2. SSL扫描工具

    工具: sslciphercheck sslscan sslciphercheck.exe -h ip -p 443 有些IP会报错:

  3. springboot中集成memcached

    前言 Memcached 是一个高性能的分布式内存对象缓存系统,其存储性能在某些方面不比redis差,甚至在文本类型数据的存储上性能略优于redis,本文将介绍如何在springboot中集成memc ...

  4. windows下使用make

    为了方便使用windows下的编辑器写代码并使用make命令,所以在windows上也安装make,教程如下 windows下使用gcc和g++需要安装MinGW32,如果已经安装过了,参考这里,然后 ...

  5. MonkeyRunner Mac环境 录制脚本和回放 批量回放

    1.MonkeyRunner是AndroidSDK自带的一个东西,在SDK目录中的tools\bin文件夹中 2.配置环境变量 编辑环境变量:打开终端输入:open ~/.bash_profile 将 ...

  6. log设计网站,一站式一键设计log网站

    log设计网站,一站式一键设计log网站 log设计网站,一键式一站式设计log网站 待办 https://www.wix.com/buildyourwebsite5/designlogo?utm_s ...

  7. 1015 Reversible Primes

    1. 题目 2. 抽象建模 无 3. 方法 无 4. 注意点 素数判断(1不是素数) 数值的倒转 5. 代码 #include<stdio.h> #include<math.h> ...

  8. es 6.x scroll用法

    我们可以使用from +size来获取所有数据,但是,如果数据量大的时候,这样的操作开销很大,这时候可以使用scroll操作 1.第一步发起一个scroll 的post请求,带上参数scroll=1m ...

  9. 【New】简•导航 正式上线

    [New]简•导航 正式上线 一个简单的导航 链接:http://huangenet.gitee.io/simple/ 欢迎访问⊙ω⊙ 代码托管在码云,访问速度更快哦!

  10. hdu 1045 Fire Net(二分图)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...