(假設元素個數為m,去重後個數為n)
時間複雜為o(m2),空間複雜度隨元素個數線性增長。資料量一大就崩了。
將資料插入到b+樹中達到去重目的,然後順序訪問葉節點鏈從而得到n值。時間複雜的為o( lgm + n ),記憶體亦隨元素個數線性增長。資料量一大就崩了。
用位陣列來表示各元素是否出現,每個元素對應一位,所需的總記憶體為n bit。能大大減少記憶體占用且位操作迅速。
如果要統計1億個資料的基數值,大約需要記憶體100000000/8/1024/1024 ≈ 12m,記憶體減少占用的效果顯著。然而統計乙個物件的基數值需要12m,如果統計10000個物件,就需要將近120g,同樣不能廣泛用於大資料場景。
實際上目前還沒有發現更好的在大資料場景中準確計算基數的高效演算法,因此在不追求絕對準確的情況下,使用概率演算法算是乙個不錯的解決方案。概率演算法不直接儲存資料集合本身,通過一定的概率統計方法預估基數值,這種方法可以大大節省記憶體,同時保證誤差控制在一定範圍內。
目前用於基數計數的概率演算法包括:
原理:
詳見:redis hyperloglog
1、神奇的hyperloglog演算法 - csdn
2、原始**:loglog counting of large cardinalities
基數估算HyperLogLog
hyperloglog 可以接受多個元素作為輸入,並給出輸入元素的基數估算值 估算值 演算法給出的基數並不是精確的,可能會比實際稍微多一些或者稍微少一些,但會控制在合理的範圍之內。hyperloglog 的優點是,即使輸入元素的數量或者體積非常非常大,計算基數所需的空間總是固定的 並且是很小的。在 ...
基數估算HyperLogLog
hyperloglog 可以接受多個元素作為輸入,並給出輸入元素的基數估算值 估算值 演算法給出的基數並不是精確的,可能會比實際稍微多一些或者稍微少一些,但會控制在合理的範圍之內。hyperloglog 的優點是,即使輸入元素的數量或者體積非常非常大,計算基數所需的空間總是固定的 並且是很小的。在 ...
再談基數估計之HyperLogLog演算法
在很久 好像也沒多久,4個月 之前,我曾經寫了一篇和主業無關的有點意思的小文章 基數估計探秘 linear counting與flajolet martin演算法 但是這篇文章講的兩個演算法都已經老掉牙了,實際應用最廣泛的基數估計演算法是hyperloglog hll 演算法。最近筆者基於flink...