zoukankan      html  css  js  c++  java
  • BitSet位图

    腾讯面试题:

      给40亿个无符号整形的不重复的数据,如何迅速判断一个数是否在这40亿个数中。

    分析:40亿个数据实在太多并且不重复,并且我们不必知道这些数据的大小,只需标记这些数是否存在。因此我们可以想到用位图来解决这个问题,这样只需占大概500M的内存空间。实现方法如下:

    #pragma once
    #include<vector>

    class BitMap
    {
    public:
        BitMap()
        {}

        BitMap(size_t n)
        {
            _bitMap.resize((n >> 5) + 1);
        }


        void set(size_t x)   //把位置1
        {
            size_t index = x >> 5;    //index表示的是占用的是第几个字符
            size_t num = x % 32;     //num表示的是占用字符中的第几个位置
            _bitMap[index] |= (1 << num);     //将num所指的位置为1
        }
        void reset(size_t x)     //把位置0
        {
            size_t index = x >> 5;
            size_t num = x % 32;
            _bitMap[index] &= (~(1 << num));    //将num所指的位置为0
        }
        bool Test(size_t x)     //测试某一位是0还是1
        {
            size_t index = x >> 5;
            size_t num = x % 32;
            return _bitMap[index] & (1 << num);
        }
    private:
        vector<size_t> _bitMap;
    };

    void test()   //测试
    {
        BitMap bm1(500);
        bm1.set(4);
        bm1.set(44);
        bm1.set(444);

        bm1.reset(44);
        cout<<bm1.Test(444)<<endl;
        cout<<bm1.Test(23)<<endl;
    }

  • 相关阅读:
    如何使用谷歌学术
    联合省选 2021 游记
    生成one-hot的方法
    GraphSAGE
    maven仓库如何引入本地jar包,Maven多种方式打可执行jar包
    DDL任务管理语句
    使用本地EDAS注册多个中台服务,供本地测试使用
    启动轻量级配置及注册中心EDAS
    端口被占用如何解决
    java8中Collectors.groupingBy 用法
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6034368.html
Copyright © 2011-2022 走看看