guest@blog.cmj.tw: ~/posts $

Count Distinct Problem


感謝 steven 教我

一開始提到 HyperLogLog 用來解決統計上的問題: Count-Distinct Problem ,用來計算一個多重集 (multiset) 中有有多少個不同數值的數量,用途都是透過統計的方式獲取逼近值。

一開始可以使用 bloom-filter 快速判斷一個元素是否在多重集中、概念跟 hash function 類似:是將一個集合映射到固定大小的集合中 ,因為 hash function 計算可以視為是常數時間,所以在時間複雜度上十分快速。而 bloom-filter 就是將多個 hash function 整合自在一起 ,m 組 hash function 將資料轉換成 mk 個點 (一個 hash function 產生 k-bit 資料)、只要計算後元素有在記錄中,很大的機率就存在。 在速度上因為每次計算 hash 都被視為是常數時間、因此判斷也是常識時間。而對於資料儲存來說也跟原始資料無關,因此也有一定的保密特性 ,但在刪除資料上卻有嚴重的缺點:因為無法判斷計算後的點是否為一、因此不能直接刪除計算後的紀錄。

HyperLogLog 中則是沿用了一樣的概念、但是多了額外的概念:透過計算連續的 0 數量 (masimum number of leading zeros) n, 並視為執行了 N 次的 poisson distribution 。也就是將 hash 後的結果分成兩個部分:決定 bucket 以及在 bucker 的位址。 例如將 hash 後的結果生成一個 64-bit、可以將前 16-bit 用來決定處於 65536 的哪一個 bucket、接下來使用剩餘的 48-bit 並視為 poisson-distribution,利用第一個 1位址來判斷落在 bucket 的哪個位址、因此儲存的空間可以視為是一個 16x6 個空間。