首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用哈希表和布隆过滤器优化搜索引擎中的URL去重与存储效率

目录前言算法设计具体实现结束语前言作为开发者想必都知道在实际开发过程中,使用搜索引擎在索引网页时,去除重复的URL是一个关键步骤,因为这可以显著提高索引的效率和准确性,同时减少存储空间的消耗。...,URL作为值(或简单地使用哈希值作为键,表示URL的存在),在哈希表中查找;如果找到,则跳过该URL(因为它是重复的);如果没有找到,则将URL及其哈希值添加到哈希表中。...在开始前,我们需要先安装mmh3库作为额外的哈希函数,并导入必要的模块,也就是一个简单的哈希函数来计算URL的哈希值。...结束语经过上文的分享介绍,想必大家都知道通过使用哈希表和布隆过滤器,可以有效地去除搜索引擎中的重复URL,并提高索引的效率和存储空间的利用率。...而且在实际应用中,我们可以根据具体的需求和资源限制来调整哈希表和布隆过滤器的参数,以达到最佳的性能和效率,看了本文的示例,确定不来操练一下试试?

11734

10亿+的超链接,如何防止重复爬取?

很容易想到的方法就是,将爬过的 URL 保存到哈希表中,因为哈希表的查询时间复杂度是 O(1),非常高效,在 Python 中,哈希表对应的数据结构有集合和字典,这里仅需要判断新的 URL 是否在哈希表中...你可能会问 URL 怎么能对应到整数的?其实有很多哈希函数可以实现这样的功能,这里就不展开介绍了。 有没有更节省内存的方案?...虽然内存占用的问题解决了,但是随着 URL 数量的增多,内存占用还是会线性增加,就算使用位图操作,100 亿个 URL 仍然要使用 1200 MB 的内存,有没有办法使内存的占用成为一个固定值?...假如我们只申请 10 亿个二进制位,现在有 100 亿的 URL ,那么通过哈希函数计算一次后会有冲突,比如 10 亿零 1 和 1 对 10 亿求余的结果都是 1 ,这就无法判断二进制位中的第一位是对应...10 亿零 1 还是 1,这里的解决办法就是多次哈希,比如有个 URL 经过一次哈希得到的二进制索引是第 x 位,第二次哈希得到 y 位,第二次哈希得到 z 位,那么 x,y,z 联合起来代表该 URL

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据结构(9)-- 哈希表 unordered_map

    Hash表在海量数据处理中有着广泛应用。 我们之前的查找,都是这样一种思路:集合中拿出来一个元素,看看是否与我们要找的相等,如果不等,缩小范围,继续查找。...那还有没有更好一点的办法呢?...那么,有没有办法在得到O(1)的查找效率的同时、又不付出太大的空间代价呢? 有,就是本篇讲的哈希表了。 很简单,我们把你的车牌号看作一个8位36进制的数字;为了方便,我们可以把它转换成十进制。...要知道,在一百万数据里面做二分法搜索,最差时也不过需要20次搜索而已;如果你的哈希函数本身需要的计算时间已经超过了这个限度,那么改用二分法显然是个更为理智的选择:不仅更快,还更省空间。...哈希表实际所存数据量和哈希表最大容量之间的比值,叫做哈希表的“加载因子”。 加载因子越小,冲突的概率就越低,但浪费大量空间;加载因子越高,冲突概率越大,但空间浪费就越少。

    1.1K11

    哈希算法

    密码学界也一直致力于找到一种快速并且很难被破解的哈希算法。我们在实际的开发过程中,也需要权衡破解难度和计算时间,来决定究竟使用哪种加密算法。...有没有比较快的方法呢? 我们可以给每一个图片取一个唯一标识,或者说信息摘要。...这个问题有两个难点,第一个是搜索日志很大,没办法放到一台机器的内存中。第二个难点是,如果只用一台机器来处理这么巨大的数据,处理时间会很长。...我们从搜索记录的日志文件中,依次读出每个搜索关键词,并且通过哈希函数计算哈希值,然后再跟 n 取模,最终得到的值,就是应该被分配到的机器编号。 这样,哈希值相同的搜索关键词就被分配到了同一个机器上。...https://time.geekbang.org/column/article/65312 22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

    42520

    go-zero 是如何做路由管理的?

    图片 Trie Tree 时间复杂度低,和一般的树形数据结构相比,Trie Tree 拥有更快的前缀搜索和查询性能。...和查询时间复杂度为 O(1) 常数的哈希算法相比,Trie Tree 支持前缀搜索,并且可以节省哈希函数的计算开销和避免哈希值碰撞的情况。 最后,Trie Tree 还支持对关键字进行字典排序。...Radix Tree Radix Tree(基数树)是一种特殊的数据结构,用于高效地存储和搜索字符串键值对,它是一种基于前缀的树状结构,通过将相同前缀的键值对合并在一起来减少存储空间的使用。...后面的节点值必须要在结请求体中有 path tag 声明,用于接收路由参数 路由节点可以包含字母、数字、下划线、中划线 接下来就让我们深入到源码层面,相信看过源码之后,你就会更懂这些规则的意义了。...t.next(v, route[i+1:], result) { return false } // 如果 url 中有参数

    30700

    什么是布隆过滤器?如何使用?

    检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。...这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的。...当前位向量的标记状态为: image.png 当对值进行搜索时,与哈希表类似,我们将使用 3 个哈希函数对 ”搜索的值“ 进行哈希运算,并查看其生成的索引值。...假设,当我们搜索 ”fullstack“ 时,3 个哈希函数输出的 3 个索引值分别是 2、3 和 7: image.png 从上图可以看出,相应的索引位都被置为 1,这意味着我们可以说 ”fullstack...但如果所有哈希索引值均为 ”1“,则只能说该搜索的值可能存在集合中。

    4K52

    在MySQL中建立自己的哈希索引(书摘备查)

    想法非常简单:在标准B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找。然而,它将会使用键的哈希值进行查找,而不是键自身。...你所要做的事情就是在where子句中手动地定义哈希函数。 一个不错的例子就是URL查找。URL通常会导至B-Tree索引变大,因为它们非常长。...即使有几行相同的url_crc值,也很容易进行精确地对比来确定需要的行。替代方案是把完整的URL索引为字符串,它要慢得多。 这个办法的一个缺点是要维护哈希值。...你可以手工进行维护,在MySQL 5.0及以上版本中,可以使用触发器来进行维护。下面的例子显示了触发器如何在插入和更新值的时候维护url_crc列。...当通过哈希值搜索值的时候,必须在where子句中包含一个常量值(literal value): select id from url where url_crc=crc32('http://www.mysql.com

    2.2K30

    内存崩溃了?其实你只需要换一种方式

    那我们在不使用数据库的情况下有没有解决办法呢?布隆过滤器!它就可以完美解决这个问题,布隆过滤器有什么特殊的地方呢?接下来就一起来学习一下布隆过滤器。...什么是布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,它是在 1970 年由一个名叫布隆提出的,它实际上是由一个很长的二进制向量和一系列随机映射函数组成,这点跟哈希表有些相同,但是相对哈希表来说布隆过滤器它更高效...因为底层是 bit 数组,所以意味着数组只有 0、1 两个值,跟哈希表一样,我们将 URL 通过 K 个函数映射 bit 数组里,并且将指向的 Bit 数组对应的值改成 1 。...布隆过滤器的误判率跟 bit 数组的大小和哈希函数的个数有关系,如果 bit 数组过小,哈希函数过多,那么 bit 数组的值很快都会变成 1,这样误判率就会越来越高,bit 数组过大,就会浪费更多的内存...,所以就要平衡好 bit 数组的大小和哈希函数的个数,关于如何平衡这两个的关系,不是我们这篇文章的重点。

    50410

    【数据结构与算法】基础算法之查找概述

    在二分查找中,我们取数据集的中间值,然后将目标与中间值进行比较。如果目标小于中间值,则在左侧子集中继续查找;如果目标大于中间值,则在右侧子集中继续查找。每次比较都会缩小要搜索的数据集的大小。...这种算法在大型数据集中非常有效,但在小型数据集中可能并不是最快的选择。 哈希表查找 哈希表查找也称为散列表查找,是另一种常见的查找算法。它利用哈希函数将数据项映射到散列表中的位置。...在查找过程中,我们只需通过哈希函数计算目标数据的位置,然后检查该位置是否包含目标数据。 哈希表查找的时间复杂度是O(1)。这使得它成为大型数据集中最快的查找算法之一。...但是,哈希表查找的效率取决于哈希函数的质量。如果两个数据项映射到相同的位置,就会发生哈希冲突,这可能会导致性能下降。 小结 在编写程序时,我们需要选择适合数据集大小和其他要求的最佳查找算法。...那么有没有一个折中的办法呢?有,那就是接下来要给大家介绍的二叉搜索树,它插入元素后,自然就是排好序的,接下来的查询也自然而然可以应用二分查找算法进行高效搜索。

    7010

    哈希算法

    那我们该如何搜索呢?我们知道,任何文件在计算中都可以表示成二进制码串,所以,比较笨的办法就是,拿要查找的图片的二进制码串与图库中所有图片的二进制码串一一比对。如果相同,则说明图片在图库中存在。...有没有比较快的方法呢?我们可以给每一个图片取一个唯一标识,或者说信息摘要。...这个问题有两个难点,第一个是搜索日志很大,没办法放到一台机器的内存中。第二个难点是,如果只用一台机器来处理这么巨大的数据,处理时间会很长。...我们从搜索记录的日志文件中,依次读出每个搜索关键词,并且通过哈希函数计算哈希值,然后再跟 n 取模,最终得到的值,就是应该被分配到的机器编号。这样,哈希值相同的搜索关键词就被分配到了同一个机器上。...如何快速判断图片是否在图库中?undefined如何快速判断图片是否在图库中?假设现在我们的图库中有 1 亿张图片,很显然,在单台机器上构建散列表是行不通的。

    47474

    从 hashtable 到 bloomfilter

    但是万一有人的后四位手机号和另一个人一摸一样怎么办?这就设计哈希冲突了。哈希冲突哈希冲突就是两个 key 经过哈希函数处理后得到结果一样,在我们的例子里边就是两个人的手机后四位一摸一样了。...我把这个冲突的 key 存到你的下一个位置,在不行就是下下个位置,这样我只是在查找和插入的代码变化一下就行了,这就是开放寻址法再一种就是我可以设计多个哈希函数呀,第一个哈希函数冲突,我用第二个哈希函数,...哈希函数本来不打算说一些哈希函数处理,但是哈希函数的一些处理思想在大数据和分布式中有大量应用,所以简单说一下几种哈希函数设计思想。...第一种就是除法哈希法,简单来说就是将 key 想办法处理成一个数字,比方说对 key 每个字符相加,得到的数字对哈希表大小取模。这种思想在 redis 分布式应用和一些大数据应用场景都有看见。...注意他是没有办法存储 key 的 value 的,他只能告诉你有没有 key 这个值。原理布隆过滤器原理很简单,首先就是需要一个位数组。

    12710

    哈希算法揭秘

    那我们该如何搜索呢?我们知道,任何文件在计算中都可以表示成二进制码串,所以,比较笨的办法就是,拿要查找的图片的二进制码串与图库中所有图片的二进制码串一一比对。如果相同,则说明图片在图库中存在。...有没有比较快的方法呢?我们可以给每一个图片取一个唯一标识,或者说信息摘要。...这个问题有两个难点,第一个是搜索日志很大,没办法放到一台机器的内存中。第二个难点是,如果只用一台机器来处理这么巨大的数据,处理时间会很长。...我们从搜索记录的日志文件中,依次读出每个搜索关键词,并且通过哈希函数计算哈希值,然后再跟 n 取模,最终得到的值,就是应该被分配到的机器编号。这样,哈希值相同的搜索关键词就被分配到了同一个机器上。...如何快速判断图片是否在图库中?undefined如何快速判断图片是否在图库中?假设现在我们的图库中有 1 亿张图片,很显然,在单台机器上构建散列表是行不通的。

    61200

    mysql索引为啥要选择B+树 (上)

    不知道你有没有这种感觉,那些所谓的数据结构和算法,在日常开发工作中很少用到或者几乎不曾用到,可能只是在每次换工作准备面试的时候才会捡起来学习学习。...今天这个标题,严格来说其实是不正确的,我在前面的文章中有这么解释过:执行一条sql语句都经历了什么? 首先,mysql 主要是由 server 层和存储层两部分构成的。...哈希表主要是利用了数组的随机访问特性,实现思想主要是通过一个哈希函数把 key 转换成一个哈希值,这个哈希值就对应数组中的某个下标。...同时,不同的 key 如果通过哈希函数转换成了相同的数组下标,这就会造成冲突,在哈希表中一般会通过再拉出一个链表来保存这个冲突的值。...二叉搜索树 注意,二叉搜索树和二叉树不一样,二叉树是指每个节点的左儿子小于父节点,父节点又小于右儿子,即二叉搜索树的中序遍历就是一个有序序列。

    61050

    【Java】基础25:List、Set以及哈希表

    于是Java就想了个办法,对真正的地址进行加密,也就是hashCode的由来。...就是我们理论上是可以创建无数多个对象的,可以不停地在电脑上new对象,但是hashCode值是有限的,它是一个int类型的数据,最多也只有42亿(2的32次方)多种可能。...①哈希值就有点类似于数组中的索引,因为哈希值不同其元素必定不同。...数组查询快,如果现在添加进来了一个元素,我根本不用遍历,我就看有没有相同的哈希值(相当于索引),直接就可以定位: 如果没有相同的哈希值,直接添加进集合。 如果有相同的哈希值,我再比较内容是否一样。...所以如果新建了一个对象,需要重写hashCode方法和equals方法,这个在开发工具中直接使用Alt+Insert自动重写方法。 HashSet的底层原理就是哈希表。

    83910

    布隆过滤器:极简存储,高效检索

    引言在海量数据的存储与检索中,如何在保持快速检索的同时,降低内存占用是个巨大的挑战。有没有一种既能快速检索又能节省内存的方案?布隆过滤器(Bloom Filter)就是这样一种数据结构。...哈希表可以通过对 “值” 进行哈希处理来获得该值对应的索引值,然后把该值存放到对应的索引位置。...这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的1。...看看这些三个位置上的数字是不是都是1就知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不存在;如果都是1,则被检元素很可能在2。...布隆过滤器在HBase中的应用HBase 是大数据领域中常用的分布式数据库系统,能够高效存储和查询数十亿条数据。它通过分块存储,将表的数据按顺序分为若干数据块,每块内的多个元素都算出一个布隆过滤器串。

    17210

    读懂区块链核心—你才真正懂区块链

    1、碰撞阻力:如果无法找到两个值在输入x和y且x≠y ,而H(x)=H(y) 的情况,则称哈希函数H具有碰撞阻力。...2、隐秘性:如果我们仅仅知道哈希函数的输出y=H(x),由于x的输入集合非常广泛,我们没有可行的办法算出输入值x。这成为哈希函数的隐秘性。...哈希指针不但可以告诉你数据存储在什么位置,并且还可以让你验证数据有没有篡改过。如下图1-1所示。 ?...图1-2区块链 在普通链表中有一系列区块,每个区块既有数据也有一个指向上一个区块的指针,但在区块链中,上一个区块指针被置换为哈希指针,这是区块链与普通区块的区别。...通过这个区块链上的哈希指针不仅能告诉你上一个区块的值在哪里,还包含了该值的摘要信息,从而使我们能够验证那个值有没有改变。在区块链链表头部存储的第一个数据区块也就是创世数据区块。

    1K10

    《这就是搜索引擎》爬虫部分摘抄总结

    图2-7是这种策略的示意图:假设队列头的网页是1号网页,从1号网页中抽取出3个链接指向2号、3号和4号网页,于是按照编号顺序依次放入待抓取URL队列,图中网页的编号就是这个网页在待抓取URL队列中的顺序编号...一个折中的办法是:每当新下载的网页攒够K个,然后将所有下载页面重新计算一遍新的非完全PageRank。...主从式分布爬虫(Master-Slave) 对于主从式分布爬虫,不同的服务器承担不同的角色分工,其中有一台专门负责对其他服务器提供URL分发服务,其他机器则进行实际的网页下载。...至于采取的判断方法,则是对网址的主域名进行哈希计算,之后取模(即hash[域名]%m,这里的m对应服务器个数),如果计算所得的值和抓取服务器编号匹配,则自己下载该网页,否则将该网址转发给对应编号的抓取服务器...将哈希值范围首尾相接,即认为数值0和最大值重合,这样可以将其看做有序的环状序列,从数值0开始,沿着环的顺时针方向,哈希值逐渐增大,直到环的结尾。

    1.4K40

    面试官:如何给字符串设计索引?

    ,发现仍然是 javafish,取出 ID2,再到 ID 索引上取整行然后判断,还是不对; 重复上一步,直到在 index_url 上取到的值不是 javafish 时,循环结束。...索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。 那还有别的方法既能保证区分度又能不占用那么多空间吗?...有的,比如:倒序存储以及加哈希字段 4.1 倒序存储 先说第一种,在存储 url 时,倒序存。这时候前缀的区分度就很高啦,利用倒序建立前缀索引。...在 CPU 消耗方面,倒序方式每次写和读的时候,都需要额外调用一次 reverse 函数,而 hash 字段的方式需要额外调用一次 crc32 () 函数。...没有办法判断哪一种最好,只有最合适的。在开发中,你也需要根据业务来选择,总的方向就是:提高区分度 & 尽量 减少占用空间。

    64320
    领券