Google Guava BloomFilter

當Guava項目發布版本11.0時,新添加的功能之一是BloomFilter類。 BloomFilter是唯一的數據結構,用于指示元素是否包含在集合中。 使BloomFilter有趣的是,它將指示元素是否絕對不包含或可能包含在集合中。

永遠不會出現假陰性的特性使BloomFilter成為用作保護條件的絕佳候選者,以幫助防止執行不必要和昂貴的操作。 雖然BloomFilters最近獲得了很好的曝光,但使用它意味著滾動自己的瀏覽器或通過Google搜索代碼。 滾動自己的BloomFilter的麻煩在于獲取正確的哈希函數來制作過濾器
有效。 考慮到Guava使用Murmur Hash來實現,我們現在有一個有效的BloomFilter有用,而只是一個圖書館而已。

BloomFilter速成課程

BloomFilters本質上是位向量。 在較高級別,BloomFilters以下列方式工作:

  1. 將元素添加到過濾器。
  2. 將其哈希幾次,然后將索引與哈希結果匹配的位設置為1。

測試元素是否在集合中時,請遵循相同的哈希過程,并檢查這些位是否設置為1或0。此過程是BloomFilter如何保證元素不存在的方法。 如果未設置位,則根本不可能將元素包含在集合中。 但是,肯定答案表示元素在集合中或發生哈希沖突。 可以在此處找到BloomFilter的更詳細描述,并在此處找到有關BloomFilters的良好教程。 根據Wikipedia的說法,Google在BigTable中使用BloomFilters來避免對不存在的項目進行磁盤查找。 另一個有趣的用法是使用BloomFilter來優化sql Querry 。

使用番石榴BloomFilter

通過調用BloomFilter類上的static方法create來創建Guava BloomFilter,
傳遞一個Funnel對象和一個int表示預期的插入次數。 漏斗也是Guava 11中的新功能,它是一個可以將數據發送到Sink的對象。 下面的示例是默認實現,其誤報百分比為3%。 Guava提供了一個Funnels類,其中包含兩個靜態方法,這些方法提供Funnel接口的實現,用于將CharSequence或字節數組插入到過濾器中。

//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(Funnels.byteArrayFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger.toByteArray());//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII.toByteArray());

更新:基于路易斯·沃瑟曼的評論,以下是如何使用自定義Funnel實現為BigIntegers創建BloomFilter的方法:

//Create the custom filter
class BigIntegerFunnel implements Funnel<BigInteger> {@Overridepublic void funnel(BigInteger from, Sink into) {into.putBytes(from.toByteArray());}}//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(new BigIntegerFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger);//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII);

注意事項

正確估計預期插入的數量至關重要。 當插入過濾器的次數接近或超過預期的數目時,BloomFilter開始填滿,結果將產生更多的誤報,直至無用之地。 還有另一個版本的BloomFilter.create方法,該方法帶有一個附加參數,雙精度表示所需的錯誤命中概率級別(必須大于0且小于1)。 錯誤命中概率的級別會影響用于存儲或搜索元素的哈希數。 所需的百分比越低,執行的哈希數越高。

結論

BloomFilter是開發人員可以在其工具箱中使用的有用項。 現在,Guava項目使在需要時開始使用BloomFilter變得非常簡單。 希望您喜歡這篇文章。 歡迎提出有用的意見和建議。

參考文獻

  • Guava BloomFilter的單元測試演示 。
  • BloomFilter類
  • 您想了解的所有關于BloomFilters的信息 。
  • BloomFilter教程 。
  • Wikipedia上的BloomFilter 。

參考:來自我們的JCG合作伙伴 Bill Bejeck的Google Guava BloomFIlter,來自“ 隨機思考編碼”博客。

翻譯自: https://www.javacodegeeks.com/2012/12/google-guava-bloomfilter.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370816.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 編程祝新年快樂_用于測試自動化的7種編程語言

導讀&#xff1a;本文重點介紹測試自動化中排名前七位的編程語言。當人們想要開始做自動化測試&#xff0c;此時卻需要開發自動化測試腳本&#xff0c;也就是要學習一門編程語言。那么&#xff0c;我們怎樣邁出這一步&#xff1f;也有你已經精通一種編程語言&#xff0c;也可以…

Day1 了解web前端

Day1 了解web前端 一.職業發展路線: 前端頁面制作、前端開發、前端架構師 二.1)前端工程師主要職責: 利用HTML/CSS/JavaScript等各種Web技術進行客戶端產品的開發。完成客戶端程序&#xff08;也就是瀏覽器端&#xff09;的開發&#xff0c;同時結合后臺技術模擬整體效果&am…

已阻止應用程序訪問圖形硬件_玩轉智能硬件之Jetson Nano(三)深度學習環境搭建...

0、前言iotboy&#xff1a;玩轉智能硬件&#xff08;一&#xff09;Jetson Nano安裝篇?zhuanlan.zhihu.comiotboy&#xff1a;玩轉智能硬件&#xff08;二&#xff09;Jetson Nano配置篇?zhuanlan.zhihu.com在玩轉智能硬件&#xff08;一&#xff09;和&#xff08;二&#x…

Vue.js開發環境搭建的介紹

包含了最基礎的Vue.js的框架&#xff0c;包含了打包工具和測試工具&#xff0c;開發調試的最基本的服務器&#xff0c;不需要關注細節&#xff0c;只需關注Vuejs對項目的實現 npm在國內的網絡使用較慢&#xff0c;所以推薦下載安裝淘寶的鏡像 1&#xff1a; 2&#xff1a;安裝c…

html文件轉換html格式,pdf文件怎么轉換成html格式

PDF文件怎么轉換成html格式呢&#xff1f;html格式其實就是網頁格式&#xff0c;PDF文件和網頁文件一般情況下是兩種完全不搭邊的格式&#xff0c;但是不可否定的是辦公室的多樣化總有人會有這樣的需求&#xff0c;只要有需求就會有其相應的解決方案。我們可以利用PDF轉Word一樣…

Eclipse中的Github Gists

我想描述有關在Eclipse中集成GitHub Gists的簡單步驟。 有幾個來源促使我這樣做&#xff1a; Eclipse的GitHub Mylyn連接器 EGit / GitHub /用戶指南 http://eclipse.github.com 我一直在使用Eclipse Java EE發行版&#xff0c;其中已經安裝了Mylyn插件&#xff1a; 1.通…

CSS3景深-perspective

3D視圖正方體&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>CSS3景深-perspective</title>6 </head>7 <style>8 #div1{9 position: rel…

python pool_派松水潭(Python Pool)

派松水潭(Python Pool)旅游景點類型&#xff1a;名勝Roebourne Winternoom Road , Roebourne , Western Australia , 6718Email:roetourbigpond.net.auWebsite:www.pilbaracoast.com派松水潭(Python Pool)坐落于羅伯恩(Roebourne)以南風景如畫的米爾斯特姆-奇切斯特國家公園內。…

【BZOJ4262】Sum 單調棧+線段樹

【BZOJ4262】Sum Description Input 第一行一個數 t&#xff0c;表示詢問組數。第一行一個數 t&#xff0c;表示詢問組數。接下來 t 行&#xff0c;每行四個數 l_1, r_1, l_2, r_2。Output 一共 t 行&#xff0c;每行一個數 Sum。Sample Input 4 1 3 5 7 2 4 6 8 1 1 9 9 9 9 1…

父類一實現serializable_我的java基礎學習易錯點和易忘點總結(一)

一.繼承A:子類只能繼承父類所有非私有的成員(成員方法和成員變量)B:子類不能繼承父類的構造方法&#xff0c;但是可以通過super關鍵字去訪問父類構造方法。二.繼承中構造方法的關系A:子類中所有的構造方法默認都會訪問父類中空參數的構造方法B:為什么呢?因為子類會繼承父類中的…

Avocado 安裝和簡單測試

1.Avocado 安裝 1.1 通過包安裝 像Fedora可以通過rpm包進行安裝&#xff0c;其他通過RPM管理的發行版需要自己制作相關包。Avocado同樣支持DEP包的安裝可以在contrib/packages/debian找到。 Fedora 首先通過下面的命令獲取倉庫配置文件。 sudo curl https://repos-avocadoproje…

html文檔主體的根標簽,2 HTML簡介標簽嵌套和并列關系文檔聲明

HTML&#xff1a;Hyper Text Markup Language 超文本標簽語言(hyper&#xff1a;精力旺盛的 markup:標記 n noun)HTML不是編程語言&#xff0c;而是一種標記語言(就是一套標記標簽)&#xff0c;用于描述網頁&#xff0c;是網頁制作必備的。超文本是指頁面內可以包含圖片、鏈接…

深入克隆

在繼續克隆概念之前&#xff0c;讓我們用對象創建概念刷新基礎知識。 使用new運算符創建對象時&#xff0c;對象將在堆中獲取內存分配。 堆中的對象創建 在Java中&#xff0c;理想情況下僅通過引用變量修改對象&#xff0c;即僅復制對象的內存地址&#xff0c;因此原始對象中…

c# 口口亂碼_c# 亂碼解決方法

1 設置web.configrequestEncoding"utf-8"responseEncoding"utf-8"fileEncoding"utf-8"/>如果相應使用gb2312 &#xff0c;則html頁面也要設置相同&#xff0c;解決亂碼。如果為 utf-8 &#xff0c;則相應的html文件的屬性要轉換成utf-8保存&a…

《你的燈亮著嗎?》個人總結

我要如何去解決問題 搞清楚問題是什么 問題就是我們的體驗和期待的所產生的差異 * 問題的本質 * 問題的定義 * 問題的產生 * 問題的表述誰需要解決問題要多維的看待問題問題來自哪里問題的解決方法在特定的層面上去解決問題問題的解決是要交給能解決問題的人--誰能解決問題別輕…

html文檔的文件頭的主要作用是什么,文件頭

本詞條缺少概述圖&#xff0c;補充相關內容使詞條更完整&#xff0c;還能快速升級&#xff0c;趕緊來編輯吧&#xff01;文件頭是位于文件開頭的一段承擔一定任務的數據&#xff0c;一般都在開頭的部分。中文名文件頭位 置位于文件開頭任 務承擔一定任務的數據類 別文…

索引和未索引執行計劃的比較_詳解Oracle復合索引+實例說明

復合索引復合索引顧名思義&#xff0c;區別于單列索引&#xff0c;是由兩個或多個列一起構成的索引。其在B樹上的數據結構是什么樣&#xff1f;如下圖&#xff0c;是一個包含兩列的復合索引。如果你觀察仔細&#xff0c;還會發現它的葉子節點是ASC遞增排序的。現根據第一個值排…

Datables使用總結

本文共四部分&#xff1a;官網 | 基本使用|遇到的問題|屬性表 一&#xff1a;官方網站&#xff1a;[http://www.datatables.net/] 二&#xff1a;基本使用&#xff1a;[http://www.guoxk.com/node/jquery-datatables] 1、DataTables的默認配置 $(document).ready(function() { …

python面向窗體的開發_Python高級進階#019 pyqt5菜單menu應用,新建多窗體

知識回顧&#xff1a;1.掌握的是QCalendarWidget日歷控件2.click點擊事件(信號)觸發3.掌握日期的格式化QDate本節知識視頻教程以下開始文字講解&#xff1a;一、案例&#xff1a;菜單1.新建第一個窗體2.一級菜單的配置3.二級菜單的配置4.利用菜單功能實現界面跳轉&#xff0c;實…

用方面清理代碼

在我以前的文章中&#xff0c;我描述了字母轉換&#xff0c;并且提到了我們使用AspectJ解決了該任務&#xff0c;但是我沒有提及AspectJ的工作原理以及一般性的方面。 因此&#xff0c;在接下來的幾行中&#xff0c;我將解釋&#xff1a; 什么是面向方面的編程&#xff0c;為什…