人生列车

follow on!success!

导航

BitMap的简单实现

面试结束的这些日子好几次接触到BitMap这个东西。到底是啥呢,究其原因就是虽然它的使用条件较为苛刻,但是它对应的时间复杂度和空间复杂度真的是惊人的好。

首先是根据其思想先写了一个比较差的实现代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     //bitmap的简单应用
 9     //查出1到10中一共9个不重复的数字,到底少了哪个数字
10     long long n=0;
11     //假设少了数字3
12     for(int i=0;i<10;i++){
13         if(i!=3){
14             n^=1<<(i);
15             printf("the n is %lld\n",n);
16         }
17     }
18 
19     for(int i=0;i<10;i++){
20             n^=1<<(i);
21     }
22     //n^=1<<(sizeof(n)*8-2);
23     int ans=0;
24     while(n>>=1){
25         ans++;
26     }
27     printf("%d\n",ans);
28     return 0;
29 }

也就是时间复杂度大概是n的样子,不过系数相对大了些。据说Java中有相对应的包来实现,想来应该会用补码的方式进行一个简单的优化吧。

我能想到的就是在合理的条件下使用lowbit的方式求出每个缺省值,这样子还可以将缺少的数字推广开来。

来自编程珠玑的简单思考

http://blog.jobbole.com/109024/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

 

posted on 2017-04-11 21:26  tianxia2s  阅读(228)  评论(0编辑  收藏  举报