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