`
lsx111
  • 浏览: 14261 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

布隆算法实现url消重

阅读更多

常用url消重算法:
    1 基于hash算法的存储
    对于每个给定的url,都是用一个已经建立好的hash算法把它映射到某个物理地址上,当我们要检验某个url是否存在时只要将这个url进行hash映射,如果映射后的地址已经存在,则说明当前这个url已经存在。否则将url和它所映射的地址作为键值对放入一个hash表中,这就需要我们设计的hash函数很好,不然在映射的过程中发生较多的冲突就会对结果照成影响。另一方面,我们将url作为键,而url的字符串也浪费了比较大的空间,显然,对于较多的url消重,这种方法并不适合。
    2 基于布隆过滤器算法的消重
    布隆过滤器是一个非常好的数据结构,它实际上是一个很长的二进制向量和一系列随即映射函数,它可以用来检测一个元素是否在一个集合中,后来也被用到表示网页的url上。
    使用布隆过滤器的优劣:
    优点:它的空间效率和查询时间都高于一般的算法。
    缺点:有一定的误识别率。(虽然有一定的误识别率,但在大量的信息搜索中,它还是一种比较好的方法)
布隆算法的基本思想:
1 设一个数据集合A={... ...}中有n个元素。
2 用一个长度为m的位向量表示V表示集合中的元素,并初始化为0。
3 写好k个具有均匀分布特性的散列函数。
4 对于元素的加入操作首先通过k个散列函数产生k个随即数h1,h2,h3... ...hk,并将V集合中对应的h1,h2... ... hk的位置置为1。查找操作同理,对于要查找的元素先通过散列函数得到k个随机数,然后判断V集合中这k个位置是否为1,如果为1则说明该元素已经有了。
误判率的计算:
  上面已经说了这种算法存在一定的误判率,那该如何将这种误判率降到最小呢?
  设m为bit数,n为元素个数,k为散列函数的个数,当k = 0.7 * m/n时算法的误判率最小。(具体证明省略)
  基于布隆算法的网页url消重的实现:

import java.util.BitSet;

public class BloomFilterTest {

	private BitSet bits;
	private int defaultsize = 2 << 24;
	private int basicsize = defaultsize - 1;

	public BloomFilterTest() {
		this.bits = new BitSet(defaultsize);
	}

	public void add(String url) {
		if (url == null) {
			return;
		}
		int pos1 = hash1(url);
		int pos2 = hash1(url);
		int pos3 = hash1(url);
		bits.set(pos1);
		bits.set(pos2);
		bits.set(pos3);
	}

	public boolean contains(String url) {
		if (url == null) {
			return true;
		}
		int pos1 = hash1(url);
		int pos2 = hash1(url);
		int pos3 = hash1(url);
		if (bits.get(pos1) && bits.get(pos2) && bits.get(pos3)) {
			return true;
		}
		return false;
	}

	public int hash1(String line) {
		int h = 0;
		for (int i = 0; i < line.length(); i++) {
			h = h * 31 + line.charAt(i);
		}
		return check(h);
	}

	public int hash2(String line) {
		int h = 0;
		for (int i = 0; i < line.length(); i++) {
			h = h * 33 + line.charAt(i);
		}
		return check(h);
	}

	public int hash3(String line) {
		int h = 0;
		for (int i = 0; i < line.length(); i++) {
			h = h * 37 + line.charAt(i);
		}
		return check(h);
	}

	public int check(int h) {
		return basicsize & h;
	}

	public void test() {
		String urls[] = { "www.baidu.com", "www.google.com", "www.sina.com",
				"www.renren.com", "www.sohu.com" };
		for (int i = 0; i < urls.length; i++) {
			add(urls[i]);
		}
		String testUrls[] = { "www.google.com", "www.dangdang.com",
				"www.360buy.com", "www.baidu.com" };
		for (int i = 0; i < testUrls.length; i++) {
			if (contains(testUrls[i])) {
				System.out.println("找到匹配的网址: " + testUrls[i]);
			} else {
				System.out.println("未找到匹配的网址");
			}
		}
	}
}

public class MainBloomFilter {
	public static void main(String[] args) {
		BloomFilterTest bft = new BloomFilterTest();
		bft.test();
	}
}

 测试结果:
找到匹配的网址: www.google.com
未找到匹配的网址
未找到匹配的网址
找到匹配的网址: www.baidu.com

分享到:
评论

相关推荐

    C# 简易爬虫程序 布隆去重算法

    下面将详细阐述爬虫的基本概念、C#实现爬虫的关键技术以及布隆去重算法的工作原理。 首先,爬虫主要由三部分组成:URL管理器、网页下载器和网页解析器。URL管理器负责维护待抓取的网址队列,网页下载器则根据队列中...

    分布式爬虫应用中布隆过滤器的研究.doc

    我们通过实现一个基于 Hadoop 的分布式网络爬虫工具,验证了改进型布隆过滤器算法在实际的分布式网络爬虫 URL 消重应用中的效果。实验结果表明,改进型布隆过滤器算法能够有效降低误判率,提高容忍能力,满足分布式...

    布隆过滤器的概述及Python实现方法

    布隆过滤器在很多场景下都有应用,如网络爬虫用于避免爬取同一个URL多次,缓存系统判断数据是否在缓存中,以及数据库去重等。在这些应用场景中,布隆过滤器可以大幅度减少存储空间的需求,并且其检查操作仍然能保持...

    python实现布隆过滤器及原理解析

    在Python中实现布隆过滤器,首先需要导入`bitarray`库,然后创建一个位数组。接着定义多个哈希函数,通常使用简单的模运算实现。插入元素时,用哈希函数计算出位数组的索引并更新。查询时,同样用哈希函数计算索引,...

    Python+Redis实现布隆过滤器

    它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 布隆过滤器的基本思想  通过一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素...

    Redis实现布隆过滤器的方法及原理

    在实际应用中,布隆过滤器常被用于解决大数据集的去重问题,例如电话号码库的去重、新闻推送的去重、爬虫URL去重、NoSQL数据库的IO优化以及垃圾邮件过滤等场景。由于其节省空间的特性,布隆过滤器尤其适用于存储和...

    分布式爬虫应用中布隆过滤器的研究.docx

    总结来说,布隆过滤器是解决分布式爬虫URL去重问题的有效工具,但其固有的误判问题需要通过创新的算法来改善。K分多映射布隆过滤器正是这样一种改进策略,通过将位数组分割和使用多个哈希函数,成功地降低了误判率,...

    9 Redis布隆过滤器插件安装.zip

    在实际应用中,Redis布隆过滤器常用于防止垃圾邮件、URL去重、推荐系统等领域,通过合理配置和使用,可以在保证效率的同时,有效降低资源消耗。不过,需要注意的是,由于其误判特性,不适用于那些对精确性要求极高的...

    分布式爬虫应用中布隆过滤器的研究.pdf

    布隆过滤器作为一种高效的数据结构,被广泛应用于解决分布式爬虫中的URL去重问题,以提高爬取效率并减少资源浪费。 布隆过滤器的基本原理是通过多个独立的哈希函数将数据映射到一个固定大小的位数组中。每个哈希...

    bloom filter布隆过滤器学习资料大全

    布隆过滤器(Bloom Filter)是一种空间效率极高...通过这个“bloom filter布隆过滤器学习资料大全”,你可以深入研究布隆过滤器的理论、算法实现以及在不同场景下的应用实例,提升对这一重要数据结构的理解和应用能力。

    Java实现短链转换项目

    项目文件"short-url"可能包含了实现上述功能的相关代码,包括SpringBoot的配置文件、Redis和MySQL的数据访问对象(DAO)、布隆过滤器的实现以及业务逻辑处理类等。通过阅读和理解这些代码,你可以进一步了解这个短链...

    爬虫脚本项目源码-算法

    5. 数据去重算法:在大规模爬取中,避免重复抓取同一页面是很重要的,可以使用哈希表或布隆过滤器来实现。 6. 反反爬虫策略:一些网站会设置验证码、检查Cookie或Session等来防止爬虫,这需要我们研究并编写对应的...

    codes-scratch-crawler:读书笔记《自己动手写网络爬虫》,自己敲的代码。主要记录了网络爬虫的基本实现,网页去重的算法,网页指纹算法,文本信息挖掘

    主要记录了网络爬虫的基本实现,网页去重的算法,网页指纹算法,文本信息挖掘 ConsistentHash 一致hash算法 HashAlgorithms hash算法大全 MurmurHash MurMurHash算法,是非加密HASH算法,性能很高,碰撞率低 ...

    数据结构与算法分析JAVA_LAB06

    在这个"数据结构与算法分析JAVA_LAB06"实验中,我们聚焦于一个特殊的概率数据结构——布隆过滤器(Bloom Filter)。 布隆过滤器是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中。它可能会...

    网络游戏-一种分布式网络爬虫系统中的URL去重方法.zip

    4. **分布式哈希表**:在分布式系统中,可以使用DHT(分布式哈希表)如Chord、Kademlia等算法,将URL分布在多台机器上。每台机器负责一部分URL,实现全局的去重。 5. **消息队列**:结合消息队列(如RabbitMQ、...

    PHP中实现Bloom Filter算法

    在PHP中实现布隆过滤器算法的代码示例如下: ```php class BloomFilter { private $bits; // 位数组 private $hashFuncNum; // 哈希函数的数量 public function __construct($hashFuncNum = 1, $size = 1000) ...

    基于Hadoop平台实现一个分布式网络爬虫

    - **已访URL识别模块**:在Reduce阶段实现,利用布隆过滤器进行URL去重处理。 #### 四、测试与评估 为了验证分布式网络爬虫系统的有效性,我们进行了功能测试和性能测试。测试结果表明,系统能够稳定运行,并且在...

Global site tag (gtag.js) - Google Analytics