从一个题目引出位图
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?
这里有两种大家容易想到的解法:
1.遍历搜索,时间复杂度为O(N)
2.先排序(O(NlogN)) ,然后利用二分查找搜索(O(logN))
上面两种方法虽然简单,但是一方面是需要的时间太久,一个内存可能没有这么大的空间用来开辟40亿个无符号整数。若是我们要将这些数全部加载到内存当中,那么将会占用16G的空间。
3.位图解决
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特来代表数据是否存在的信息,如果二进制比特位为1,代表存在;如果为0,代表不存在,比如:
无符号整数总共有2^32个,因此记录这些数字就需要2^32个比特位,也就是512M的内存空间,内存消耗大大减少。
这里就引出位图的概念:
位图的概念
位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。