返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C# 位图BitArray的使用
  • 667
分享到

C# 位图BitArray的使用

2024-04-02 19:04:59 667人浏览 独家记忆
摘要

前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿

前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。

位图

先看一个问题, 假如有1千万个整数,整数范围在1到1亿之间,如何快速确定某个整数是否在这个1千万个整数中呢?

乍一看是一个查找问题,循环、二分查找都是常规思路。

一个好的答案是存储结构和算法的完美结合, 基于题干上的特征和条件,我们是否有其他思路。

对于题干我们使用高中排列组合的思维:有1亿个有编号的空篮子,我们拿出这1千万个有数字的球,放进对应的篮子。

最后,所有的篮子有两种状态:有球/无球,我们要确定某个数字是否存在,就看对应篮子是否为空。

什么是位图?每一位存放某种状态,适用于海量数据,通常用于判断数据是否存在。位图的空间由数据的最大值决定。

位图这种数据结构来大大节省内存的使用量。

我们只需要构造一个长度为1亿的bit数组,将有球位置标记为1,无球位置默认记为0; 这样我们就将数字转换成了一个被压缩紧致的数组索引,1亿bit数组不到16M空间。

确定某位置有球,只需要O(1)的时间复杂度。

常用属性

Count BitArray中包含实例的个数

IsReadOnly 获取一个值,该值指示BitArray是否为只读

Item 获取或设置BitArray中特定位置的值

Length 获取或设置BitArray中元素的数目

常用的方法

And 和指定的BitArray中相应的元素做and运算

Or 按位或运算

Xor 按位异或运算

Not 取反所有元素

Get 获取特定位置处的值

Set 设定特定位置处的值

SetAll 将BitArray中所有的元素设定为指定的值 


public sealed class BitArray : ICollection, IEnumerable, ICloneable
{
    public BitArray(BitArray bits); //用已有的BitArray给新的BitArray初始化
    
    public BitArray(bool[] values); //用布尔数组初始化
    
    public BitArray(byte[] bytes);  //用字节数组初始化
    
    public BitArray(int length);    //初始化并设置位数值,此值会在使用中自动增长
    
    public BitArray(int[] values);  //用int数组初始化
    
    public BitArray(int length, bool defaultValue); //初始化并设置默认值
    
    public int Count { get; }   //位数组中现存的位的个数
    
    public bool IsReadOnly { get; } //确定位数组是否只读

    public bool IsSynchronized { get; } //是否同步对此BitArray的操作,用在线程安全上
    
    public int Length { get; set; }   //位数组的位数

    public object SyncRoot { get; }
    
    public bool this[int index] { get; set; } //索引器,利用索引读位值
    
    public BitArray And(BitArray value);  //按位与

    public object Clone();  //创建BitArray 的浅表副本。
    
    public void CopyTo(Array array, int index);  //将BitArray拷贝到其他数组中
    
    public bool Get(int index);    //按下标读取位值

    public IEnumerator GetEnumerator(); //返回循环访问BitArray 的枚举数

    public BitArray Not();  //按位非

    public BitArray Or(BitArray value);  //按位或
    
    public void Set(int index, bool value);  //按位设置值
    
    public void SetAll(bool value); //设置所有位为指定值

    public BitArray Xor(BitArray value);  //按位异或
}

C# 有专业的位图数组:BitArray


using System;
using System.Collections;

namespace Bitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine();
            var num = int.Parse(input);
            var bitmap = InitBitMap();
            if (bitmap.Get(num))
            {
                Console.WriteLine($"找到数字{num}");
            }
            else
            {
                Console.WriteLine($"未找到数字{num}");
            }
        }
        public static BitArray InitBitMap()
        {
            var myBA1 = new BitArray(10000);
            var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
            foreach (int element in arr1)
            {
                myBA1[element] = true;
            }
            return myBA1;
        }
    }
}

BitArray是管理位值的紧凑数组,用布尔值表示,其中true表示位是开启的(1),false表示位是关闭的(0), 是引用类型,位于System.Collections命名空间。

以上只是小试牛刀,我们针对原题再发散一下,如何找到以上1千万数字中重复的数字?

还是篮子中放球的思路,这次我们要两排篮子,也就是两个BitMap,利用位AND运算(同时为True,结果才是True)找到两排篮子中均有球的位置。


using System;
using System.Collections;

namespace Bitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            var bitmap = InitBitMap();
            for (int i = 0; i < bitmap.Length; i++)
            {
                if(bitmap[i] == true)
                {
                    Console.WriteLine(i);
                }
            }
        }
        public static BitArray InitBitMap()
        {
            var myBA1 = new BitArray(10000);
            var myBA2 = new BitArray(10000);
            var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
            foreach (int element in arr1)
            {
                if (myBA1[element] == false)
                {
                    myBA1[element] = true;
                }
                else
                {
                    myBA2[element] = true;
                }
            }
            myBA1 = myBA1.And(myBA2);
            return myBA1;
        }
    }
}

最后提醒各位:宝藏组件Redis天然支持位图

到此这篇关于C# 位图BitArray的使用的文章就介绍到这了,更多相关C# 位图BitArray内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C# 位图BitArray的使用

本文链接: https://lsjlt.com/news/129282.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C# 位图BitArray的使用
    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿...
    99+
    2024-04-02
  • C#BitArray点阵列的使用
    目录BitArray 类中的属性BitArray 类中的方法在 C# 中,BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启...
    99+
    2023-05-14
    C# BitArray点阵列 C# 点阵列
  • C# BitArray点阵列如何使用
    这篇文章主要介绍了C# BitArray点阵列如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C# BitArray点阵列如何使用文章都会有所收获,下面我们一起来看看吧。在 C# 中,...
    99+
    2023-07-05
  • 使用C++实现位图处理
    目录位图的引入什么是位图位图的应用bitset的使用定义方式成员函数bitset的运算符重载赋值-关系-复合赋值-单目运算符[]重载位图的引入 无序的40亿个不重复的无符号整数,给一...
    99+
    2023-05-16
    C++位图处理 C++位图操作
  • C++ 位图及位图的实现原理
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重复...
    99+
    2024-04-02
  • C语言位图及位图的实现
    本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下 1.概念 位图(bitset)是一种常用的数据结构,常用在给一个很大范围的数,判断其中的一个数是不是在其...
    99+
    2024-04-02
  • C#使用BitConverter与BitArray类进行预定义基础类型转换
    一、BitConverter 将预定义的基础类型与字节数据进行互转(Unicode) 1、将值类型转成字节数组(Unicode):BitConverter.GetBytes() by...
    99+
    2024-04-02
  • C++中的位运算和位图bitmap解析
    目录位运算总结移位运算位运算应用举例位图位运算总结 移位运算 移位运算是双目运算符,两个运算分量都是整形,结果也是整形。“<<” 左移:右边空出的...
    99+
    2024-04-02
  • C++中位图的实现示例
    这篇文章主要介绍C++中位图的实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用...
    99+
    2023-06-15
  • C++位图怎么实现
    这篇文章给大家分享的是有关C++位图怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据...
    99+
    2023-06-15
  • C# BitArray(点矩阵)转换成int和string的方法实现
    BitArray的基础可以看菜鸟编程 BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0)。 当您...
    99+
    2024-04-02
  • Pygame Rect区域位置的使用(图文)
    Rect(rectangle)指的是矩形,或者长方形,在 Pygame 中我们使用 Rect() 方法来创建一个指定位置,大小的矩形区域。函数的语法格式如下: rect =py...
    99+
    2024-04-02
  • C++哈希应用的位图和布隆过滤器
    目录C++哈希应用的位图和布隆过滤器 一、位图1.位图的概念2.位图的面试题3.位图的实现4.位图的应用二、布隆过滤器1.布隆过滤器的提出2.布隆过滤器的概念3.布隆过滤器的插入4....
    99+
    2024-04-02
  • C++位图的实现原理与方法
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重...
    99+
    2024-04-02
  • C语言常用占位符的使用小结
    目录C语言中常用的占位符占位符的修饰符总结在 C语言中,占位符是一种用于格式化输出的特殊字符,通常用于 printf() 等输出函数中,用于指定输出的格式和内容。在本文中,我们将详细...
    99+
    2023-05-20
    C语言占位符
  • C语言位运算符的具体使用
    目录布尔位运算符 移位运算符 对于更多紧凑的数据,C 程序可以用独立的位或多个组合在一起的位来存储信息。文件访问许可就是一个常见的应用案例。位运算符允许对一个字节或更大的数据单位中独...
    99+
    2024-04-02
  • C/C++QtQChart绘图组件的具体使用
    QtCharts 组件是QT中提供图表绘制的模块,该模块可以方便的绘制常规图形,Qtcharts 组件基于GraphicsView模式实现,其核心是QChartView和QChart...
    99+
    2024-04-02
  • C语言中位图怎么实现
    这篇文章主要介绍C语言中位图怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下1.概念位图(bitset)是一种常用的数据结构,常用在给...
    99+
    2023-06-15
  • C语言全方位讲解指针的使用
    目录一、指针的概念1.1、变量和地址1.2、指针变量和指针的类型二、指针变量2.1、指针变量的定义及使用2.2、指针运算三、野指针3.1、概念:3.2、野指针的成因3.3、如何规避野...
    99+
    2024-04-02
  • C语言全方位讲解数组的使用
    目录一维数组的创建和初始化1.数组的创建2.数组创建方式 3.数组的初始化一维数组的使用一维数组的存储二维数组的创建与初始化 1.二维数组的创建2.二维数组的初始...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作