引子
給定 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中布隆過濾器不存在時,說明此次查詢是無效的(繞過緩存直接查詢數據庫)
還可以用於去重,比如爬蟲判斷網址是否已經爬取過。