1. 程式人生 > >java 爬蟲使用Bloom Filter 演算法實現Visited表

java 爬蟲使用Bloom Filter 演算法實現Visited表

在生活中,包括在設計計算機軟體時,經常要判斷一個元素是否在一個集合中,最直接的辦法就是將全部元素都存在計算機中,遇到一個新元素,將它與集合中的元素比較即可。一般來講,計算機中的集合是使用雜湊表來儲存的。它的好處是快速而準確,缺點是費儲存空間。當集合比較小時,這個問題不顯著,但當集合非常巨大時,雜湊表儲存效率低的問題就體現出來了。
一種稱為布隆過濾器的數學工具,它只需要雜湊表的1/8到1/4的大小就能解決同樣的問題。它是使用bloom filter演算法實現的,用java程式碼實現如下:

package net.csdn.diu_brother;

import java.util.BitSet;

public
class SimpleBloomFilter{ private static final int DEFAULT_SIZE = 2<<24; private static final int[] seeds = new int[]{7,11,13,31,37,61}; private BitSet bits = new BitSet(DEFAULT_SIZE); private SimpleHash[] func = new SimpleHash[seeds.length]; public static void main(String[] args){ String value
= "[email protected]"; SimpleBloomFilter filter = new SimpleBloomFilter(); System.out.println(filter.contains(value)); filter.add(value); System.out.println(filter.contains(value)); } public SimpleBloomFilter(){ for(int i=0;i<seeds.length;i++){ func[i] = new
SimpleHash(DEFAULT_SIZE,seeds[i]); } } public void add(CrawlUrl value){ if(value!=null){ add(value.getOriUrl()); } } public void add(String value){ for(SimpleHash f:func){ bits.set(f.hash(value),true); } } public boolean contains(CrawlUrl value){ return contains(value.getOriUrl()); } public boolean contains(String value){ if(value==null){ return false; } boolean ret =true; for(SimpleHash f:func){ ret = ret && bits.get(f.hash(value)); } return ret; } public static class SimpleHash{ private int cap; private int seed; public SimpleHash(int cap,int seed){ this.cap = cap; this.seed = seed; } public int hash(String value){ int result = 0; int len = value.length(); for(int i=0;i<len;i++){ result = seed*result+value.charAt(i); } return (cap-1)&result; } } }

相關推薦

java 爬蟲使用Bloom Filter 演算法實現Visited

在生活中,包括在設計計算機軟體時,經常要判斷一個元素是否在一個集合中,最直接的辦法就是將全部元素都存在計算機中,遇到一個新元素,將它與集合中的元素比較即可。一般來講,計算機中的集合是使用雜湊表來儲存的。它的好處是快速而準確,缺點是費儲存空間。當集合比較小時,這個

布隆過濾器Bloom Filter演算法Java實現(用於去重)

在日常生活中,包括在設計計算機軟體時,我們經常要判斷一個元素是否在一個 集合中。比如在字處理軟體中,需要檢查一個英語單詞是否拼寫正確(也就是要判斷它是否在已知的字典中);在 FBI,一個嫌疑人的名字是否已經在嫌疑名單上;在網路爬蟲裡,一個網址是否被訪問過等等。最直接的方法就

Bloom Filter 演算法實現

#ifndef __BLOOM_H__ #define __BLOOM_H__ #include<stdlib.h> typedef unsigned int (*hashfunc_t)(const char *); typedef struct { si

基於Bloom-Filter演算法和記憶體資料庫的大量資料輕量級100%排重方案

總體模組:一次排重模組(基於布隆演算法) + 二次排重方案(基於記憶體資料庫) 一次排重 //雜湊函式,返回型別為int型 //int型數的總數量[4294967296] (範圍大約在正負21億) //int型別4個位元組,32bits //排重標誌陣列的總長度[4294967296/(4*

java資料結構之手動實現單鏈

package com.example.demo; // 1、定義要儲存物件的類: class Phone {// 此類提供要儲存的資料 private String brand; private double price; public Phon

Java利用遞迴演算法實現24點遊戲

24點遊戲 經典的紙牌益智遊戲,常見遊戲規則:         從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。         基本要求: 隨機生成4個代表撲克牌牌面

Java資料結構和演算法--雜湊

Hash表也稱散列表,直譯為雜湊表,hash表是一種根據關鍵字值(key-value)而直接進行訪問的資料結構。它基於陣列,通過把關鍵字對映到陣列的某個下標來加快查詢速度,這種對映轉換作用的函式我們稱之為雜湊函式。 每種雜湊表都有自己的雜湊函式,雜湊函式是自己定義的,沒有統一的標準,下面我們

使用java自帶加密演算法實現文字的md5加密演算法

       本篇使用java自帶的MessageDigest實現對文字的md5加密演算法,具體程式碼如下: /** *@Description: 將字串轉化為MD5 */ packa

Java版數獨演算法實現

數獨的歷史:   數獨前身為“九宮格”,最早起源於中國。數千年前,我們的祖先就發明了洛書,其特點較之現在的數獨更為複雜,要求縱向、橫向、斜向上的三個數字之和等於15,而非簡單的九個數字不能重複。儒家典籍《易經》中的“九宮圖”也源於此,故稱“洛書九宮圖”。而“九宮”之名也因《

java資料結構和演算法(雜湊)

什麼是雜湊表? 雜湊表是一種資料結構,提供快速的插入和查詢操作。 優點: 插入、查詢、刪除的時間級為O(1); 資料項佔雜湊表長的一半,或者三分之二時,雜湊表的效能最好。缺點: 基於陣列,陣列建立後難於擴充套件,某些雜湊表被基本填滿時效能下降的非常嚴重;沒有一種簡單的方

Java爬蟲-使用HttpClient+Jsoup實現簡單的爬蟲爬取文字

##一、工具介紹   HttpClient是Apache Jakarta Common下的子專案,用來提供高效的、最新的、功能豐富的支援HTTP協議的客戶端程式設計工具包,並且它支援HTTP協議最新的版本和建議。HttpClient已經應用在很多的專案中,比如A

Java(二分查詢演算法實現,分別使用遞迴和非遞迴方式)

public class BinarySearch { private int[] array; private int index; private int min; private int max; public BinarySearch(int[]

Java密碼學原型演算法實現——第一部分:標準Hash演算法

題注 從部落格中看出來我是個比較鍾愛Java的應用密碼學研究者。雖然C在密碼學中有不可替代的優勢:速度快,但是,Java的可移植性使得開發人員可以很快地將程式碼移植到各個平臺,這比C實現要方便的多。尤其是Android平臺的出現,Java的應用也就越來越廣。因此,我本人在密

JAVA 爬蟲之httpclient post請求提交單獲取Ajax資料

public static String httpPostWithJSON(String url) throws Exception { HttpPost httpPost = n

java資料結構與演算法之順序與連結串列深入分析

關聯文章:   資料結構與演算法這門學科雖然在大學期間就已學習過了,但是到現在確實也忘了不少,因此最近又重新看了本書-《資料結構與演算法分析》加上之前看的《java資料結構》也算是對資料結構的進一步深入學習了,於是也就打算寫一系列的資料結構的博文以便加

資料結構Java版的查詢演算法實現

import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Set; /** * 查詢的基本演算法: *

Java密碼學原型演算法實現——第三部分:雙線性對

背景介紹 技術部落格已經好久沒更新了。倒不是因為沒得寫,是因為實在是太忙了,而且研究也到了一個瓶頸期,需要大量閱讀文獻。 本來打算很長一段時間都不更新部落格了,甚至打算等我畢業工作後再更新一些有價值的部落格,但是最近在CSDN私信上和知乎上經常收到求救帖子,

資料結構演算法實現-順序基本操作

資料結構演算法實現 實現了高一凡的<<資料結構>>,書中的程式碼是基於VC6++ c++語言實現的,網上也可以找到TC版的c語言實現的原始碼,TC版的原始碼平臺是 Turbo C 2.0 ,編譯軟體相對較早,因此將採用CodeBlock

java實現模擬LinkedList類

trac () object new mov this index als size LinkedList類底層數據結構 模擬: 1 package Collection; 2 3 public class MyLinkedList { 4 No

php實現Bloom Filter

class 好的 問題 hash page var_dump 影響 baidu 長度  Bloom Filter(BF) 是由Bloom在1970年提出的一種多哈希函數映射的高速查找算法,用於高速查找某個元素是否屬於集合, 但不要求百分百的準確率。 Bl