zoukankan      html  css  js  c++  java
  • 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);
    }

  • 相关阅读:
    看起来像一个输入框的input,实际上是有两个input
    Actions类的一些主要方法
    selenium通过WebDriverWait实现ajax测试,实现等页面元素加载完成
    如何判断新打开窗口是否需要切换
    鼠标悬停
    Selenium WebDriver使用IE浏览器
    Element should have been select but was input
    58同城Java面试
    2个线程ABAB或者BABA循环输出
    使多个线程循环输出099099
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5374726.html
Copyright © 2011-2022 走看看