【数据结构和算法】位图 BitMap

这篇具有很好参考价值的文章主要介绍了【数据结构和算法】位图 BitMap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 位图结构的实现

/**
 * 位图数据类型 <br />
 * 位图以字节的一位为单位进行元素的操作,但是位运算以一个字节整体为运算单位,因此代码中以 bytes[index] 进行运算。
 * 位图元素的添加即找到相应的位置,将其置为1,实现时将该元素所在字节位与(1<<元素在字节所在位)求或即可;
 * 位图元素的删除即找到相应的位置,将其置为0,实现时将该元素所在字节位与(1<<元素在字节所在位)取反再求与即可;
 * 检查一个元素是否在位图中,实现时将该元素所在字节位与(1<<元素在字节所在位)求与后判断是否为0即可。
 *
 */
public class BitMap {
    private byte[] bytes;

    private int capacity;

    private static final int DEFAULT_CAPACITY = 32;

    public BitMap() {
        this(DEFAULT_CAPACITY);
    }

    public BitMap(int capacity) {
        this.capacity = capacity;
        this.bytes = new byte[(capacity >> 3) + 1];
    }

    /**
     * ADD
     *
     * @param num 元素
     */
    public void add(int num) {
        bytes[index(num)] |= (iterateByte(num));
    }

    /**
     * DELETE
     *
     * @param num 元素
     */
    public void delete(int num) {
        bytes[index(num)] &= (~iterateByte(num));
    }

    /**
     * 判断是否存在
     *
     * @param num 元素
     * @return 如果存在返回 true,否则返回 false
     */
    public boolean contains(int num) {
        return (bytes[index(num)] & iterateByte(num)) != 0;
    }

    /**
     * 计算 num/8
     *
     * @param num 运算数
     * @return 索引
     */
    private int index(int num) {
        return num >> 3;
    }

    /**
     * 获取元素字节所在位字节
     *
     * @param num 运算数
     * @return 1 左移 num%8 位 的结果
     */
    private int iterateByte(int num) {
        return 1 << (num & 0x07);
    }

    public byte[] getBytes() {
        return bytes;
    }

    public int getCapacity() {
        return capacity;
    }
}

2. 利用位图排序

public void sortByBitMap() {
	int[] arr = {4, 9, 2, 17, 3, 10};
	BitMap bitMap = new BitMap();
	for (int i : arr) {
		bitMap.add(i);
	}

	List<Integer> result = new ArrayList<>();
	byte[] bytes = bitMap.getBytes();
	for (int i = 0; i <bytes.length; i++) {
		for (int j = 0; j < 8; j++) {
			if ((bytes[i] & (1 << j)) == (1 << j)) {
				result.add((i << 3) + j);
			}
		}
	}

	System.out.println(result);
}

文章来源地址https://www.toymoban.com/news/detail-635002.html

到了这里,关于【数据结构和算法】位图 BitMap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索Redis特殊数据结构:Bitmaps(位图)在实际中的应用

    Redis官方提供了多种数据类型,除了常见的String、Hash、List、Set、zSet之外,还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic(HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Configuration)和Time series。这些数据类型在Redis的数据结构中发挥着各自独特的作用。

    2024年01月19日
    浏览(44)
  • 【数据结构】盘点那些经典的 [哈希面试题]【哈希切割】【位图应用】【布隆过滤器】(10)

    前言 大家好吖,欢迎来到 YY 滴 数据结构 系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月04日
    浏览(57)
  • java入门,程序=数据结构+算法

    一、前言 在学习java的时候,我印象最深的一句话是:程序=数据结构+算法,对于写java程序来说,这就是java的入门。 二、java基本数据结构与算法 1、数据类型 java中的数据类型8种基本数据类型: 整型 byte 、short 、int 、long 浮点型 float 、 double 字符型 char 布尔型 boolean 还有包

    2024年02月05日
    浏览(61)
  • java数据结构与算法:栈

    代码: 测试: 链表头为堆栈顶 代码: 测试:

    2024年01月21日
    浏览(53)
  • Java 数据结构与算法-树

    树的基础知识 树是算法面试经常遇到的数据结构之一,在实际工作中也有可能经常用到…… 应聘者在准备算法面试时最需要重视的是二叉树…… 二叉树是一种典型的具有递归性质的数据结构。二叉树的根节点可能有子节点,子节点又是对应子树的根节点,它可能也有自己的

    2024年02月08日
    浏览(54)
  • Java数据结构与算法:查找算法之二分查找

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎回到本专栏。在这个冰冷的季节里,我们将一同探讨Java中一种高效的查找算法——二分查找。让我们点燃知识的火花,一同解锁这个查找奇迹的秘密! 二分查找简介 二分查找,也称为折半查找,

    2024年01月21日
    浏览(47)
  • 【数据结构】用Java实现七大排序算法

    目录 🌷1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指标 1.2 十个排序算法  1.3 十个排序性能对比 🌷2. 冒泡排序 2.1 算法描述 2.2 动图 ⭐️代码优化 🌷3. 选择排序 3.1 算法描述 3.2 动图  3.3 代码 🌷4. 插入排序 4.1 算法描述 4.2 动图  4.3 代码 🌷5 希尔排序 5.1 描述 5.2 动图  

    2023年04月23日
    浏览(54)
  • 【算法与数据结构】Java实现查找与排序

    也叫做折半查找,属于有序查找算法。 前提条件 :数组数据必须有序,从小到大,或者从大到小都是可以的。 如果是无序的,也可以先进行排序。 但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数

    2024年01月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包