日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构与算法】【算法思想】位图

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构与算法】【算法思想】位图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

位圖BitMap

算法

public class BitMap { // Java中char類型占16bit,也即是2個字節private char[] bytes;private int nbits;//nbits 總容量public BitMap(int nbits) {this.nbits = nbits;this.bytes = new char[nbits/16+1];}//長度16 k/16 定位某一段 k%16定位段中某一位public void set(int k) {if (k > nbits) return;int byteIndex = k / 16;int bitIndex = k % 16;//將數字 A 的第 k 位設置為1:A = A | (1 << (k - 1)) bytes[byteIndex] |= (1 << bitIndex);}public boolean get(int k) {if (k > nbits) return false;int byteIndex = k / 16;int bitIndex = k % 16;//將數字 A 的第 k 位設置為0:A = A & ~(1 << (k - 1))//檢測數字 A 的第 k 位:A & (1 << (k - 1)) != 0return (bytes[byteIndex] & (1 << bitIndex)) != 0;} }

布隆過濾器

使用 K 個哈希函數,對同一個數字進行求哈希值,那會得到 K 個不同的哈希值,我們分別記作 X1?,X2?,X3?,…,XK?。我們把這 K 個數字作為位圖中的下標,將對應的 BitMap[X1?],BitMap[X2?],BitMap[X3?],…,BitMap[XK?]都設置成 true,也就是說,我們用 K 個二進制位,來表示一個數字的存在。當我們要查詢某個數字是否存在的時候,我們用同樣的 K 個哈希函數,對這個數字求哈希值,分別得到 Y1?,Y2?,Y3?,…,YK?。我們看這 K 個哈希值,對應位圖中的數值是否都為 true,如果都是 true,則說明,這個數字存在,如果有其中任意一個不為 true,那就說明這個數字不存在。

布隆過濾器的允許誤判。如果某個數字經過布隆過濾器判斷不存在,那說明這個數字真的不存在,不會發生誤判;如果某個數字經過布隆過濾器判斷存在,這個時候才會有可能誤判,有可能并不存在。調整哈希函數的個數、位圖大小跟要存儲數字的個數之間的比例,那就可以將這種誤判的概率降到非常低。

應用

如何實現網頁爬蟲中的URL去重功能?
我們用布隆過濾器來記錄已經爬取過的網頁鏈接,假設需要判重的網頁有 10 億,那我們可以用一個 10 倍大小的位圖來存儲,也就是 100 億個二進制位,換算成字節,那就是大約 1.2GB。之前我們用散列表判重,需要至少 100GB 的空間。相比來講,布隆過濾器在存儲空間的消耗上,降低了非常多。
**利用布隆過濾器,在執行效率方面,比散列表更加高效。**布隆過濾器用多個哈希函數對同一個網頁鏈接進行處理,CPU 只需要將網頁鏈接從內存中讀取一次,進行多次哈希計算,理論上講這組操作是 CPU 密集型的。而在散列表的處理方式中,需要讀取散列值相同(散列沖突)的多個網頁鏈接,分別跟待判重的網頁鏈接,進行字符串匹配。這個操作涉及很多內存數據的讀取,所以是內存密集型的。我們知道 CPU 計算可能是要比內存訪問更快速的,所以,理論上講,布隆過濾器的判重方式,更加快速。

筆記整理來源: 王爭 數據結構與算法之美
參考資料:https://mp.weixin.qq.com/s/xxauNrJY9HlVNvLrL5j2hg

總結

以上是生活随笔為你收集整理的【数据结构与算法】【算法思想】位图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。