位圖、分治和布隆過濾器

引子


給定 40 億個不重複的沒排過序的 unsigned int 型整數,然後再給定一個數,如何快速判斷這個數是否在這 40 億個整數當中?

位圖


bitmap:就是用一個或多個 bit 來標記某個元素對應的值,而鍵就是該元素。採用位作爲單位來存儲數據,可以大大節省存儲空間。

解決40億個整數中的是否存在某個數字可以使用位圖。

思路:建立長度爲40億的位數組,遍歷這40億個數字,假設數字爲5,那麼將位數組中數組下標爲5的位改爲1,如果數組中下標爲5的位已經是1,那麼不操作。假設當給定數字爲7,當位數組下標爲0時說明不存在,當位數組下標爲1時說明已經存在。

分治法


基於分治法也可解決這個問題。

思路:將40億個數字根據哈希映射,映射到多個小文件中。再把給定的數字也進行哈希映射,映射到那個文件就在那個文件中查找這個數字是否存在。

如,對40億個數字按一千萬取模,這個會得到400個小文件:a0、a1、a2、a3、…a399,假設給定的數字爲256,那麼應該查找文件a256是否存在這個數字。

布隆過濾器


通過位圖,可以實現布隆過濾器。
布隆過濾器是由二進制向量(或者說位數組)和一系列隨機映射函數(哈希函數)兩部分組成的數據結構。
布隆過濾器可以判斷一個字符一定不存在或者可能存在。當判斷一個字符可能存在,但實際上這個字符並不存在。

布隆過濾器可以解決緩存穿透問題:將數據庫中存在的數據放到Redis中的布隆過濾器中,當查詢的數據在Redis中布隆過濾器不存在時,說明此次查詢是無效的(繞過緩存直接查詢數據庫

還可以用於去重,比如爬蟲判斷網址是否已經爬取過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章