• 位图法


    位图法是大数据处理中经常用到的技巧,觉得挺有趣,就来讲几句,希望能把位图的思想解释清楚。

    个人理解,如有错误,欢迎各路大神指正!

    位图法:计算机中表示数据的最小单位为Bit,存储0或者1。而c#中int的大小为4个字节,即32个bit。

    如果用int类型表示一个数值,那么一个数值就需要用到32位的存储空间,如果使用0或者1来表示当前索引对应值是否存在,那么原本一个int所占用的空间,可以表示32个整数。

    [0] [1] [1] [0] [0] [0] [0] [1] ,如果当一个元素的值为1时,我们就可以判断出其对应的索引值存在,这个例子中表示1,2,7存在。

    可以简单的说,数据内存占用率降低到了1/32.

    当我们要处理的数据量不仅巨大,并且数据值也极大的时候,用一般的整数值类型(int,int64,long)会造成大量的内存消耗。

    这时候使用位图法,就能体现出其优势。

    实现(c#):

    这里是用位图法实现的排序方法。

    public static Array BitSort(int[] arr, int largestNumber) //传入数组,以及数组的最大值
            {
                BitArray bitAry = new BitArray(largestNumber+1);//根据数据的最大值,创建相应的点阵列
    
                foreach (var item in arr) 
                {
                    bitAry[item] = true;//把数组元素值作为索引,将该索引对应的值置为1,表示该值存在
                }
    //一次遍历之后,要排序的数组包含的所有值,在点阵列中被置为1
    int[] result = new int[arr.Length]; var j = 0; for (var i = 0; i < bitAry.Length; i++) { if (bitAry[i] == true) //遍历点阵列,如果对应的值为1,则将其索引值放置到新集合内,一次遍历,就可以完成排序 { result[j] = i; j++; } } return result; }

    用位图法,也可以来快速判断,一个大数据集合中,是否包含了某个特定的值。

    思路:创建位图来反应数据集,用特定值作为索引,判断值是否为1,若为1,则表示该值存在于数据集合中。

    也可以用来去重,有兴趣的,可以自己实现以下。

    劣势:

    1. 需要知道数据集的范围,方可快速确定知道需要创建多大的位图。

    2. 如果数据离散程度大,那么空间使用率低。如[1,2,3,4,5,900000,900001]

    3. 可能较难理解。

  • 相关阅读:
    java安全——BASE64
    Spring Aop 梳理
    Spring Aop中,获取被代理类的工具
    关于eclipse运行TestNG出现: CreateProcess error=206, ÎļþÃû»ò)չÃû的解决办法
    java内存设置
    用python开发调试器——起始篇
    5分钟破解全峰快递
    重拾黑客
    ThreadPoolExecutor的运转机制
    20190627_解决ADB的device offline问题的两种方法
  • 原文地址:https://www.cnblogs.com/ChallengeEverything/p/9069970.html
Copyright © 2020-2023  润新知