根據(jù)原理主要可以分為兩類:循環(huán)和哈希。
循環(huán)
以python為例合搅,比如可以用for循環(huán)、也可以利用python的內(nèi)置函數(shù)reduce特性實(shí)現(xiàn)去重。
python的內(nèi)置函數(shù)reduce能對(duì)序列中的數(shù)據(jù)實(shí)現(xiàn)累積惫谤。reduce的參數(shù)有兩個(gè),一個(gè)是一個(gè)函數(shù)珠洗,一個(gè)序列溜歪,reduce函數(shù)首先是對(duì)元素中的第一個(gè)元素、第二個(gè)元素利用傳入的函數(shù)進(jìn)行操作许蓖,再將獲得的結(jié)果與第三個(gè)元素進(jìn)行操作蝴猪,以此類推,最后蛔糯,獲得結(jié)果拯腮。
image
哈希
哈希函數(shù)是指可以將任意大小的數(shù)據(jù)轉(zhuǎn)換成特定大小的數(shù)據(jù)的函數(shù),轉(zhuǎn)換后的數(shù)據(jù)成為哈希值或哈希編碼蚁飒。
由于哈希表消耗的內(nèi)存很大动壤,當(dāng)數(shù)據(jù)量非常大的時(shí)候就無法使用它來去重。因此就出現(xiàn)了布隆過濾器(bloom filter)淮逻。
-
布隆過濾器原理
布隆過濾器的核心就是利用位數(shù)組和幾個(gè)哈希函數(shù)來表示一個(gè)集合琼懊。假設(shè)位數(shù)組的長(zhǎng)度為m阁簸,哈希函數(shù)有k個(gè)。當(dāng)給布隆過濾器中添加元素的時(shí)候哼丈,首先利用幾個(gè)哈希函數(shù)計(jì)算當(dāng)前元素的編碼启妹,得到位數(shù)組的k個(gè)位置,然后在數(shù)組中將這k個(gè)位置置1醉旦。需要查詢某個(gè)元素是否存在的時(shí)候饶米,同樣也是先計(jì)算當(dāng)前元素在位數(shù)組中的k個(gè)位置,然后依次比較這k個(gè)位置的值是否都為1车胡,如果有一個(gè)不為1檬输,那么當(dāng)前元素一定不在布隆過濾器里面,如果都為1匈棘,元素可能在丧慈。因此布隆過濾器具有一定的誤判率, - 由于哈希表是精確匹配主卫,適用于數(shù)據(jù)量小的時(shí)候逃默,或者內(nèi)存足夠的時(shí)候,以及一些不能接受誤判的場(chǎng)景簇搅。而布隆過濾器完域,適合海量數(shù)據(jù)去重,并且能容忍錯(cuò)誤率的情況馍资,比如:爬蟲中網(wǎng)頁去重筒主、垃圾郵件的過濾、字處理軟件中檢查單詞是否拼寫正確鸟蟹。