C#位图BitArray 小试牛刀

news/2024/7/19 14:29:52 标签: 数据结构, 算法, js, html, javascript
htmledit_views">
html" title=js>js_content">

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

难缠的布隆过滤器,这次终于通透了

位图

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

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

一个好的答案是html" title=数据结构>数据结构和html" title=算法>算法的完美结合, 基于题干上的特征和条件,我们是否有其他思路。

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

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

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

位图这种html" title=数据结构>数据结构来大大节省内存的使用量。


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

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

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天然支持位图

我是有态度的马甲, 不追热点,原创输出#八股文#硬核干货#职场心得#,欢迎关注。

今天因为你的点赞,让我元气满满!


http://www.niftyadmin.cn/n/1864487.html

相关文章

分享两篇Google Map API的介绍

这两篇文章也不知道我是什么时候下载下来的&#xff0c;一直丢在桌面上没有看&#xff0c;但终于在年后无聊就看了一下&#xff0c;结果让我心潮澎湃&#xff0c;一起哈成了“都让Google做了我们还做什么?(WebMap方向)”一文&#xff0c;总的来说&#xff0c;我看完这两个文章…

云原生系统之弹性模式

大纲1.云原生系统的弹性模式resiliency pattern 1.1 服务故障的雪崩效应 1.2 回应之前云原生--弹性请求的疑问&#xff1f;2. 弹性模式&#xff1a;作用在下游请求消息上3. 短期中断的响应码4. Polly经典策略5. Golang 断路器模式德国哲学家尼采说过&#xff1a;那些杀…

三分钟掌握共享内存 Actor并发模型

点击上方蓝字进行关注吃点好的&#xff0c;很有必要。今天介绍常见的两种并发模型&#xff1a;共享内存&Actor共享内存面向对象编程中&#xff0c;万物都是对象&#xff0c;数据行为对象&#xff1b;多核时代&#xff0c;可并行多个线程&#xff0c;但是受限于资源对象&…

三分钟总览微软任务并行库TPL

点击上方蓝字进行关注有小伙伴问我每天忽悠的TPL是什么&#xff1f;☹️ 这次站位高一点&#xff0c;严肃讲一讲。引言俗话说&#xff0c;不想开飞机的程序员不是一名好爸爸&#xff1b;作为微软技术栈的老鸟&#xff0c;一直将代码整洁之道奉为经典&#xff0c; 优秀的程序员将…

共享内存 Actor并发模型到底哪个快?

HI&#xff0c;前几天被.NET圈纪检委懒得勤快问到共享内存和Actor并发模型哪个速度更快。前文传送门&#xff1a;《三分钟掌握共享内存 & Actor并发模型》说实在&#xff0c;我内心10w头羊驼跑过.....先说结论1.首先两者对于并发的风格模型不一样。共享内存利用多核CPU的优…

如何主动清空.NET数据库连接池?

一般我们的项目中会使用1到2个数据库连接配置&#xff0c;同程艺龙的数据库连接配置被收拢到统一的配置中心&#xff0c;由DBA统一维护&#xff0c;业务方通过某个配置字符串拿到的是开箱即用的Connection对象。DBA能在对业务方无侵入的情况下&#xff0c;给业务方切换备份数据…

我是状态机, 一颗永远骚动的机器引擎

之前有小伙伴问我 async/await语法糖编译后其实是状态机模型&#xff0c;到底什么是状态机&#xff1f;状态机是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。看起来好像对象改变了它的类。请仔细理解上面每一个字。我们以自动售货机为例&#xff0c;…

面试官:实现一个带值变更通知能力的Dictionary

如题&#xff0c; 你知道字典KEY对应的Value什么时候被覆盖了吗&#xff1f;最近大家都在追.Net6 update&#xff0c;咱还是保持节奏&#xff0c;通用语言聊技术。没背景说个铲铲上文中 数据获取组件维护了业务方所有(在用)的连接对象&#xff0c;DBA能在后台无侵入的切换备份库…