zoukankan      html  css  js  c++  java
  • BitMap位图


    BitMap位图算法
    https://blog.csdn.net/varyall/article/details/79662029

    常见面试题

    题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数。

    方案1:使用2-Bitmap
    每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义。然后遍历修改Bitmap中的对应位,如果是00则变01,01则变10,10则保持不变。遍历修改完后,最后遍历输出对应位是01的整数。

    方案2:分治法
    先将2.5亿个数划分成 2.5亿/2 个组,每个组里2个整数,再在每个组里去掉重复的整数后进行排序,然后再进行归并,最终便可得到只出现过一次的整数。

    总结: 用位图法好。

    题2:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

    方案1:使用Bitmap
    一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位。由于2^32=42.9+亿,那么2^32bit才能存下40亿个数,也就需要2^32=4Gb=0.5GB=512M内存。读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

    方案2:二分法
    我们把40亿个数中的每一个数都用32位的二进制来表示,因为它们的二进制中每一位要么是0要么是1,因此可以根据数据的某一位来分,该位为1的在分配在一组,该位为0的分配在另一组。这里的二分法就是采用了这种思想。
    已知需要查询的这位数的二进制的每位是0还是1,所以从最高位到最低位,总共需进行31次二分查找(由于是unsigned类型,所以最高那位都为0),时间复杂度为O(logn)。

    总结: 用位图法很直接,但占用内存量会大点;利用二分法比较巧妙,不太容易想到。
  • 相关阅读:
    VMware 怎么创建虚拟机
    强制css属性生效
    Linux中的文件权限
    Linux中的文件操作
    Halcon学习:缺陷检测
    Halcon学习:简单目标检测(人脸识别)
    Halcon学习:静态车牌识别
    Halcon学习:坏点检测
    Halcon学习:图像的傅里叶变换
    Halcon学习:图像滤波
  • 原文地址:https://www.cnblogs.com/kancy/p/10629518.html
Copyright © 2011-2022 走看看