一般来说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. 1、Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. Apache NIFI

    Add a.password file to chrome. Settings -> Advanced -> Security -> Manage Certificates -> ...

  3. Python记

    在企业应用领域,Java或C#都是不错的选择.

  4. 中国城市区号脚本-mysql

    中国城市区号 300个. SET NAMES utf8mb4; ; DROP TABLE IF EXISTS `citycode`; CREATE TABLE `citycode` ( `codeId ...

  5. SpringMVC:Controller配置总结

    西部开源-秦疆老师:SpringMVC系列博客 , 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringMVC:Controlle ...

  6. 软件工程 实验一 Git版本管理

    实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)   熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git init git status指 ...

  7. mysql获取字段信息

    SELECT TABLE_SCHEMA AS `databaseName`, TABLE_NAME AS `tableName`, COLUMN_NAME AS `columnName`, DATA_ ...

  8. js处理json字符串

    后台输出的字符串为 res= {"result":"true","data":"提交成功"} 前台js无法转化成对象,需 ...

  9. DE1-LINUX运行

    在官网下载.img文件:网址:http://download.terasic.com/downloads/cd-rom/de1-soc/linux_BSP/ 写入DE1_SOC_SD.img文件: 打 ...

  10. mybatis(六):设计模式 - 建造者模式