• Bitset位图


        位图(bitmap)就是用每一位来存放某种状态,适合于大规模数据但是数据状态又不是很多的情况下,通常来判断数据是否存在。位图的常见应用有两种:

        1.存放大规模数据,例如腾讯的面试题,给40亿个unsigned int的整数。给一个无符号的整数,融合判断这个数是否在这40亿个整数中。一个bit位代表一个unsigned int值,读入40 亿个数设置相应的bit位,为1表示存在,为0表示不存在。

        2.用位图法来判定一个数组是否存在重复。它的做法是:按照集合中最大元素max创建一个长度为max+1的数组,扫描该数组,遇到几就给该数组的第几位+1置1,如果遇到某位已经是1了,则表示该位减一的数据存在重复。

        其代码实现如下:

    #pragma once
    #include<vector>

    class BitMap
    {
        public:
             BitMap()
                :_size(0)
                {}


            BitMap(size_t n)
                :_size(0)
                {
                      _array.resize((n >> 5) + 1);//无符号整形是八个字节32个比特位
                }


            bool Test(size_t num)//查看此数是否存在
            {
                  size_t index = num>>5;
                  size_t n = num % 32;
                  return _array[index]&(1 << n);
            }


            bool set(size_t num)
          {
                size_t index = num >> 5;
                size_t n = num % 32;
               if (_array[index] & (1 << n))
              {
                   return false;
              }

                _array[index] |= 1 << n;//注意这里,右移是向其高位移动,并不是真的向右移动
                _size++;
               return true;
            }


             bool reset(size_t num)
           {
                  size_t index = num >> 5;

                  size_t n=num%32;

                  if(!_array[index]&(1<<n);
                {
                      return false;
                }
               _array[index] &= ~(1 << n);
               _size--; 
               return true;
           }


             void clear()
            {
                _array.assign(_array.size(), 0);
            }

        protected:
                vector<size_t> _array;
                size_t _size;
    };

    void test()
    {
    BitMap bm1(100);
    bm1.set(1);
    bm1.set(33);
    bm1.set(69);
    bm1.set(100);

    bm1.reset(33);
    }

  • 相关阅读:
    vscode 鸿蒙开发板hi3861 hispark需要使用Jlink V10以上版本仿真器,才支持RISC-V,在线调试
    hi3861 hispark GDB openOCD 调试器仿真器在vscode中如何使用呢?
    ArduinoUNO R3接口定义
    OpenOCD-HI3861-RISCV使用方法 (JTAG/DTM+SWD/CoreSight)调试器仿真器
    c#字符串序列化-字符串转对象转字符串
    c#winform设置字体字号大小
    SAP MM——常用表
    C++ WIN32 日志程序
    C++ WIN32 程序 ,从屏幕输入 数据 然后给WCHAR 数组赋值
    Ubuntu 16.04开启SFTP服务
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5374726.html
Copyright © 2020-2023  润新知