如何解決排重問題:java
對於大量的數據,有不少排重方案可使用,典型的就是哈希表。哈希表實際上爲每個可能出現的數字提供了一個一一映射的關係,每一個元素都至關於有了本身的獨享的一份空間,這個映射由散列函數來提供(這裏咱們先不考慮碰撞)。實際上哈希表甚至還能記錄每一個元素出現的次數,可是用哈希表的話,會佔用不少的空間,因此此處不考慮。算法
作兩件事:數組
Bitmap的好處在於空間複雜度不隨原始集合內元素的個數增長而增長,而它的壞處也源於這一點——空間複雜度隨集合內最大元素增大而線性增大。maven
google的guava包中提供了BloomFilter類,新建一個maven工程,引入guava包 函數
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency>
bloom算法相似一個hash set,用來判斷某個元素(key)是否在某個集合中。和通常的hash set不一樣的是,這個算法無需存儲key的值,對於每一個key,只須要k個比特位,每一個存儲一個標誌,用來判斷key是否在集合中。google
算法:
1. 首先須要k個hash函數,每一個函數能夠把key散列成爲1個整數
2. 初始化時,須要一個長度爲n比特的數組,每一個比特位初始化爲0
3. 某個key加入集合時,用k個hash函數計算出k個散列值,並把數組中對應的比特位置爲1
4. 判斷某個key是否在集合時,用k個hash函數計算出k個散列值,並查詢數組中對應的比特位,若是全部的比特位都是1,認爲在集合中。code
優勢:不須要存儲key,節省空間hash
缺點:
1. 算法判斷key在集合中時,有必定的機率key其實不在集合中
2. 沒法刪除it
它其實是由一個很長的二進制向量和一系列隨機映射函數組成,布隆過濾器能夠用於檢索一個元素是否在一個集合中。它的優勢是空間效率和查詢時間都遠遠超過通常的算法,缺點是有必定的誤識別率(假正例False positives,即Bloom Filter報告某一元素存在於某集合中,可是實際上該元素並不在集合中)和刪除困難,可是沒有識別錯誤的情形(即假反例False negatives,若是某個元素確實沒有在該集合中,那麼Bloom Filter 是不會報告該元素存在於集合中的,因此不會漏報)。io