Java算法之位图的概念和实现详解

 更新时间:2023年10月26日 10:44:43   作者:CodeJiao  
这篇文章主要介绍了Java算法之位图的概念和实现详解,位图可以利用每一位来对应一个值,比如可以利用int类型的数去存储0~31这个集合的数字,如果该集合内的数字存在,则把对应的位设置位1默认为0,需要的朋友可以参考下

位图的介绍

位图可以利用每一位来对应一个值,比如可以利用int类型的数去存储0~31这个集合的数字。如果该集合内的数字存在,则把对应的位设置位1(默认为0)。

在这里插入图片描述

如果要存储的集合元素范围超过了32个,则可以用int数组去实现位图,第一个数组元素保存0~31的元素,第二个数组元素保存32~63的数组元素。

位图的好处就是可以节省大量的空间,缺点是实现比较复杂。

注意:

并不是说int类型的位图只可以存储0~31的集合元素,也可以存储例如5~36的元素,在存储的时候设置一下规则就行了,1位对应5,2位对应6,…32位对应36。

位图的实现

我们先把完整的实现代码放在这里,后面会分析里面的具体实现。

public class BitMap {
    private final long[] bitMap;

    /**
     * 构造函数
     *
     * @param max 位图存储着 [0,max]的元素
     */
    public BitMap(int max) {
        bitMap = new long[(max + 64) >> 6];
    }

    /**
     * 往位图里面添加元素
     *
     * @param num 待添加的元素
     */
    public void add(int num) {
        bitMap[num >> 6] |= (1L << (num & 63));
    }

    /**
     * 删除位图里面的元素
     *
     * @param num 待删除的元素
     */
    public void delete(int num) {
        bitMap[num >> 6] &= ~(1L << (num & 63));
    }

    /**
     * 观察目标元素num在位图中是存在
     *
     * @param num 目标元素
     * @return 存在返回1,否则返回0
     */
    public boolean contains(int num) {
        return (bitMap[num >> 6] & (1L << (num & 63))) != 0;
    }
}

构造函数

代码实现:

    /**
     * 构造函数
     *
     * @param max 位图存储着 [0,max]的元素
     */
    public BitMap(int max) {
        bitMap = new long[(max + 64) >> 6];
    }

分析:

在这里插入图片描述

添加元素

代码实现:

    /**
     * 往位图里面添加元素
     *
     * @param num 待添加的元素
     */
    public void add(int num) {
        bitMap[num >> 6] |= (1L << (num & 63));
    }

分析:

在这里插入图片描述

删除元素

代码实现:

    /**
     * 删除位图里面的元素
     *
     * @param num 待删除的元素
     */
    public void delete(int num) {
        bitMap[num >> 6] &= ~(1L << (num & 63));
    }

分析:

删除元素与添加元素类似,只是需要把该位置元素设置为0,而不是1。这里使用&元素去实现。

在这里插入图片描述

判断元素是否存在

代码实现:

    /**
     * 观察目标元素num在位图中是存在
     *
     * @param num 目标元素
     * @return 存在返回1,否则返回0
     */
    public boolean contains(int num) {
        return (bitMap[num >> 6] & (1L << (num & 63))) != 0;
    }

分析:

在这里插入图片描述

到此这篇关于Java算法之位图的概念和实现详解的文章就介绍到这了,更多相关Java位图的概念和实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaSE、JavaEE和JavaWeb三大工程目录详解

    JavaSE、JavaEE和JavaWeb三大工程目录详解

    这篇文章主要给大家介绍了关于JavaSE、JavaEE和JavaWeb三大工程目录的相关资料,很多对java不是很了解的同学在看到课程⼤纲的时候发现⾥⾯出现了JavaSE、JavaEE、JavaME、JavaWEB这些词,搞得⼀头雾⽔,需要的朋友可以参考下
    2023-07-07
  • Spring注解 TX声明式事务实现过程解析

    Spring注解 TX声明式事务实现过程解析

    这篇文章主要介绍了Spring注解 - TX 声明式事务实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java 动态增加定时任务示例

    java 动态增加定时任务示例

    本篇文章主要介绍了java 动态增加定时任务示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java多线程中Lock锁的使用小结

    Java多线程中Lock锁的使用小结

    这篇文章主要介绍了Java多线程中Lock锁的使用小结,本节主要讲了它的基本使用,大家可以举一反三,试试什么条件下会导致死锁,需要的朋友可以参考下
    2022-06-06
  • java版十大排序经典算法:完整代码

    java版十大排序经典算法:完整代码

    优秀的文章也不少,但是Java完整版的好像不多,我把所有的写一遍巩固下,同时也真诚的希望阅读到这篇文章的小伙伴们可以自己去从头敲一遍,不要粘贴复制!希望我的文章对你有所帮助,每天进步一点点
    2021-07-07
  • java多线程volatile内存语义解析

    java多线程volatile内存语义解析

    这篇文章主要介绍了java多线程volatile内存语义解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 利用java实现一个客户信息管理系统

    利用java实现一个客户信息管理系统

    这篇文章主要给大家介绍了关于利用java实现一个客户信息管理系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java中的静态代码块、构造代码块、构造方法详解

    java中的静态代码块、构造代码块、构造方法详解

    下面小编就为大家带来一篇java中的静态代码块、构造代码块、构造方法详解。小编觉得挺好的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧
    2016-03-03
  • IDEA整合jeesite4.x及安装教程

    IDEA整合jeesite4.x及安装教程

    本文给大家介绍IDEA整合jeesite4.x及安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 使用Mybatis遇到的坑之Integer类型参数的解读

    使用Mybatis遇到的坑之Integer类型参数的解读

    这篇文章主要介绍了使用Mybatis遇到的坑之Integer类型参数的解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论