zoukankan      html  css  js  c++  java
  • 如何判断一个数是否在40亿个整数中?

    基本思路:将数字存入 set 集合中并不是一个很好的选择,占用的空间太大。这里可以使用 bitmap 数据结构来解决这个问题。

    32 位机器上,对于一个整型数,比如int a=1 在内存中占 32bit 位,这是为了方便计算机的运算。但是对于某些应用场景而言,这属于一种巨大的浪费,因为我们可以用对应的 32bit 位对应存储十进制的 0-31 个数,而这就是 Bit-map 的基本思想。Bit-map 算法利用这种思想处理大量数据的排序、查询以及去重。

    bitmap 快速查找

    我们可以申请一个 2^32 的空间(约42亿),然后我们对所有数字进行一次遍历,然后将相应的状态位修改为 1,遍历完成后我们就就可以进行查询了。由于我们是的数字是连贯的,所以我们可以用一种分桶查找的思想来进行快查找,可以对目标值除以 32(定位到对应的桶),然后再取余,这样就可以定位到相应的状态位。如果状态位为 1,则目标值重复,如果为 0,则目标值不重复。

    bitmap 快速的去重

    思路和上面的基本一样,甚至我们可以为每个位分配 2bits,假定数字不存在为 00,存在一次为 01,存在两次及以上为 11。最后我们可以对状态位进行统计, 就可以得到不重复的数字个数了,时间复杂度为 O(n)。

    使用 Bit-map 的思想,我们可以将存储空间进行压缩,而且可以对数字进行快速排序、去重和查询的操作。Bloom Fliter 是 Bit-map 思想的一种扩展,它可以在允许低错误率的场景下,大大地进行空间压缩,是一种拿错误率换取空间的数据结构。

  • 相关阅读:
    NSIndexPath 延伸
    iOS进阶推荐的书目
    配置App真机测试证书的流程 一览
    NSAttributedString 的21种属性 详解
    KVO & 通知 小记
    贝塞尔曲线 & CAShapeLayer & Stroke 动画 浅谈
    提升开发人员修为的探讨
    热门IOS 第三方库
    drawRect & 内存 -> 深究
    CALayer & UIView 关系浅析
  • 原文地址:https://www.cnblogs.com/manastudent/p/12264383.html
Copyright © 2011-2022 走看看