zoukankan      html  css  js  c++  java
  • bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.

            先看看这个题目:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数. 限制: 可用内存为600MB.  


           又是大数据。 看到42亿, 有灵感没? 要知道, 2的32次方就是42亿多一点点啊。42亿个无符号整数存在于文件里。 我们能够考虑在内存中用bit-map与之建立二值状态映射。 2的32次方个无符号整数。 须要内存空间为512M, 这个是非常easy计算的。


           这么大的空间。 要用栈数组肯定不行。 可考虑用堆。

    还是我们之前介绍过的bit-map,  用不着多说(别说我不描写叙述思路啊, 代码就体现了思路), 直接给出代码:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    #define BIT_INT 32   // 1个unsigned int能够标志32个坑
    #define SHIFT 5
    #define MASK 0x1f
    #define N 4294967296 // 2的32次方
    
    unsigned int *a = NULL;
    
    // 必须用堆
    void createArr()
    {
    	a = new unsigned int[1 + N / BIT_INT];
    }
    
    void deleteArr()
    {
    	delete []a;
    	a = NULL;
    }
    
    // 将全部位都初始化为0状态
    void setAllZero()
    {
    	memset(a, 0, (1 + N / BIT_INT) * sizeof(unsigned int));
    }
    
    // 设置第i位为1
    void setOne(unsigned int i)
    {
    	a[i >> SHIFT] |= (1 << (i & MASK));
    }
    
    // 设置第i位为1
    void setZero(unsigned int i)
    {
    	a[i >> SHIFT] &= ~(1 << (i & MASK));
    }
    
    // 检查第i位的值
    int getState(unsigned int i)
    {
    	return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;
    }
    
    void setStateFromFile()
    {
    	ifstream cin("test.txt");  // 我測试的时候, 文件里的数据为:7 8 9 2 5 2 6 0 1 4 
        unsigned int n;
        while(cin >> n)  
        {  
            setOne(n);
        }  
    }
    
    void printResult()
    {
    	unsigned int i = 0;
    	for(i = 0; i < N; i++)
    	{
    		if(0 == getState(i))
    		{
    			cout << i << endl; // 3
    			break;
    		}
    	}	
    }
    
    int main() 
    {
    	createArr();
    	setAllZero();
    	setStateFromFile();
    	printResult();
    	deleteArr();
    
    	return 0;
    }

           结果与预期相符。  我们在測试的时候, 用的数据较小。 有兴趣的朋友能够把数据量加大, 进行測试。


           OK, 无非又是利用bit-map来节省空间而已, 事实上非常easy。

    本文先介绍到这里了。






  • 相关阅读:
    java学习之实例变量初始化
    rip中的连续子网以及不连续子网
    扫描工具
    WScript.SendKeys()的sendkeys发送组合键以及特殊字符
    sql 查询包含字符的数量统计
    leetcode题1Two sum 练习
    vs 2015密钥
    前端 边界圆角
    前端 字体样式
    前端 高级选择器 伪类选择器
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6820278.html
Copyright © 2011-2022 走看看