如何确定10亿个数中是否存在某数M

  1. 一般的情况我们会用for循环来判断某个数是否在一亿的数据中。但是一亿数据进行for循环消耗的时间很大的。时间复杂度为O(N).。在N非常大的时候,时间会很长。
  2. 在算法有一种位图算法可以实现快速的判断某个数据是否存在于10亿个数据数据中。
  3. 先给出代码:
  4. #include
    using namespace std;
    int number[1000];
    void setnumber(int num)
    {
    int i = num / 32;
    int j = num % 32;
    number[i] = (number[i] | (1 << j));
    }
    void zero(int num)
    {
    int i = num / 32;
    int j = num % 32;
    number[i] = number[i] & (~(1 << j));
    }
    bool inNumber(int num)
    {
    int i = num / 32;
    int j = num % 32;
    int tmep = number[i];
    int flag = ((number[i]>>j) & 1);
    return flag == 1;
    }
    int main()
    {
    memset(number, 0, sizeof(number));
    setnumber(300);
    cout << inNumber(300) << endl;
    zero(300);
    cout << inNumber(300) << endl;
    system(“pause”);
    return 0;
    }
    一个int型有32个字节。我们单纯的表示亿个数据是否存在。可以查找某一位数对应的bit位是否为1即可。这样一个int型可以表示32个数的存在与否,那么10亿个数据也就只需要3200万个int型表示即可。
    上述代码描述了如何把一个数据标识位存在setnumber(int num)函数。如何把一个数据删除
    void zero(int num)函数,如何判断一个数据是否存在bool inNumber(int num)。通过位图算法,我们可以实现甚至几千亿的数据的控制和检测。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值