面试结束的这些日子好几次接触到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); 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 ",ans); 28 return 0; 29 }
也就是时间复杂度大概是n的样子,不过系数相对大了些。据说Java中有相对应的包来实现,想来应该会用补码的方式进行一个简单的优化吧。
我能想到的就是在合理的条件下使用lowbit的方式求出每个缺省值,这样子还可以将缺少的数字推广开来。
来自编程珠玑的简单思考
http://blog.jobbole.com/109024/?utm_source=blog.jobbole.com&utm_medium=relatedPosts