热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bitmap算法的介绍

尽管用某种列表的下表来作为某个元素的值这种想法很多人都有(大学的时候做算法题经常会有这种想法,有时也会付诸实践),但是相信刚从大学出来,很少有人会知道这种思想已经被提炼成一种算法了。b

尽管用某种列表的下表来作为某个元素的值这种想法很多人都有(大学的时候做算法题经常会有这种想法,有时也会付诸实践),但是相信刚从大学出来,很少有人会知道这种思想已经被提炼成一种算法了。

bitmap算法的意思就像他的名字,它是由一堆bit组成的map,它先初始化一大堆bit,就假设n个bit吧。然后,这些bit的下标作为某种哈希算法的值,bit本身表示该值是否存在。如果不告诉你他的应用场景,你可能会觉得这是一个怪异的数据结构。

下面看这样一个问题,你是一个淘宝比价网的程序员,你要实现一个爬虫,爬取淘宝很多很多的url。我们可以想到,淘宝有成亿上兆的商品,这意味着你爬取得数据量可以说是海量。我们也可以想像得到,这些url肯定会有重复,因为很多页面下的链接指向的是同一个商品。那么问题来了

我如何对这些海量的url进行去重?

那么我们来分析,去重,最耿直的想法是,一个一个看,每一个新爬取的url需要与前面的爬取的url进行比较,这个是属于没有计算机素养,小孩子也可以想到的办法。
那么有些学过编程的同学,会说我使用Set这种数据结构,这种数据结构本身已经实现了去重,我好方便的,直接往里面丢就行了。

其实这些想法都忽略了这是一个海量数据处理问题:我算有一亿的商品,一个url我算0.05kb,那么整个Set占用4882.8125Mb,就是4个G的内存,工业上是不允许的。

那么现在我们来看看bitmap

我有一亿商品的url,我直接分配一亿个bit,bit的下表表示这些url的hash值,至于数据的内容嘛我就丢数据库好了,反正我去重也只需要比较hash值。
现在我将这些url全部都hash,并将下表为这些hash值的bit位全部置为1,如果接下来的一个url,下标为他的hash值的bit位已经是1,那么表示这个url已经存在了(灰色表示该bit为1,下图表示hash值为3的url已经存在了)
这里写图片描述
那么像这样子,我们就可以用一亿个bit来代表这一亿个url来参与解决去重问题,总共需要多少空间呢?
100000000Bit = 12500000Byte = 12207Kb = 12Mb 这个空间效率的提升是核爆式的。

一个问题
这种bitmap算法需要使用到hash来处理元素的值,既然是hash,那么就会存在冲突,在冲突的情况下,可能会有另一个不一样的url,他的hash值也是3,这个时候我们看到下标为3的bit位被置为1,就会认为这是个已经存在的,出现这个错误的概率是n/(m*p),n为被置为1的bit数,m为总的bit数,p为hash冲突的概率,如何降低这个概率?下面就会说到这个算法的升级版:布隆过滤器。


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
博艺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有