bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G

        之前聊过很多与bitmap有关的东东, 今天我们来看这样一个问题:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G.


        很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <fstream>  
  3. using namespace std;  
  4.   
  5. #define BIT_INT 32   // 1个unsigned int可以标志32个坑  
  6. #define SHIFT 5  
  7. #define MASK 0x1f  
  8. #define N 4294967296 // 2的32次方  
  9.   
  10. unsigned int *a = NULL;  
  11.   
  12. // 必须用堆  
  13. void createArr()  
  14. {  
  15.     a = new unsigned int[1 + N / BIT_INT];  
  16. }  
  17.   
  18. void deleteArr()  
  19. {  
  20.     delete []a;  
  21.     a = NULL;  
  22. }  
  23.   
  24. // 将所有位都初始化为0状态  
  25. void setAllZero()  
  26. {  
  27.     memset(a, 0, (1 + N / BIT_INT) * sizeof(unsigned int));  
  28. }  
  29.   
  30. // 设置第i位为1  
  31. void setOne(unsigned int i)  
  32. {  
  33.     a[i >> SHIFT] |= (1 << (i & MASK));  
  34. }  
  35.   
  36. // 设置第i位为1  
  37. void setZero(unsigned int i)  
  38. {  
  39.     a[i >> SHIFT] &= ~(1 << (i & MASK));  
  40. }  
  41.   
  42. // 检查第i位的值  
  43. int getState(unsigned int i)  
  44. {  
  45.     return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;  
  46. }  
  47.   
  48. // 用bitmap记录是否存在  
  49. void setStateFromFile()  
  50. {  
  51.     ifstream cin("a.txt");  
  52.     unsigned int n;  
  53.     while(cin >> n)    
  54.     {  
  55.         setOne(n);  
  56.     }    
  57. }  
  58.   
  59. // 哈哈  
  60. void printCommonNumber()  
  61. {  
  62.     ifstream cin("b.txt");  
  63.     unsigned int n;  
  64.     while(cin >> n)    
  65.     {  
  66.         if(1 == getState(n))  
  67.         {  
  68.             cout << n << " ";  
  69.         }  
  70.     }    
  71.   
  72.     cout << endl;  
  73. }  
  74.   
  75. int main()   
  76. {  
  77.     createArr();  
  78.     setAllZero();  
  79.   
  80.     // a.txt: 4 5 7 2 9 2 4 8 0 11   (其实a.txt中可以有40亿个无符号整数)  
  81.     // b.txt: 6 11 0 2 3   (其实b.txt中可以有10000个无符号整数)  
  82.   
  83.     setStateFromFile();  
  84.     printCommonNumber(); // 11 0 2  
  85.     deleteArr();  
  86.   
  87.     return 0;  
  88. }  

       OK, 不多说, 一切思路尽在代码之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值