前言
今天遇到一个求未排序数组中重复数的算法题,要求时间复杂度O(n),本来使用的是map实现的,但是波波说有更好的bitmap算法,并给了我他的博客链接,看完之后豁然开朗。
bitmap算法的定义
Bitmap就是用一个bit位来标记某个元素对应的Value, 而Key即是该bit的位序。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。 bitmap通过1个位表示一个状态,比如:int类型有2^32个数字,即4G个数字,那么每个数字一个状态,就是2^32个bit,即512 MB(也就是说,用512兆存储空间就可以处理4G个数据,即40+亿数据)。
优点与缺点
- 优点:
- 排序查询效率高,时间复杂度:O(n)
- 占用内存少,比如N=10000000;只需占用内存为N/8=1250000Byte=1.25M。
- 缺点:所有的数据不能重复。即不可对重复的数据进行排序和查找。
存储结构
首先存入一个数字5,则放入第5位
00000000000000000000000000100000
而存入2的时候
00000000000000000000000000100100
输入3时候
000000000000000