什麼是sketch?
(個人理解:相似於將數據歸類,當你要找某一個元素時,只需再這類中找,而不需遍歷所有數據,以減少空間內存)網絡
散列:
- Hash,通常翻譯作「散列」,也有直接音譯爲」哈希「的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
Count-min sketch:
- 經過設置多個散列函數減小散列衝突,將計數器的最小值做爲測量結果,是一種典型的 sketch。
(個人理解:由上對散列的描述可知不一樣的輸入可能會散列成相同的輸出,會致使計數時偏大,因此因選擇計數器的最小值來減少偏差)數據結構
- Count-min sketch 算法
- 該算法的技巧:不存儲全部的不一樣的元素,只存儲它們Sketch的計數。
- 思路:建立一個長度爲 x 的數組,用來計數,初始化每一個元素的計數值爲 0;
對於一個新來的元素,哈希到 0 到 x 之間的一個數,好比哈希值爲 i,做爲數組的位置索引;
這是,數組對應的位置索引 i 的計數值加 1;
那麼,這時要查詢某個元素出現的頻率,只要簡單的返回這個元素哈希後對應的數組的位置索引的計數值便可。
考慮到使用哈希,會有衝突,即不一樣的元素哈希到同一個數組的位置索引,這樣,頻率的統計都會偏大。
- 對於頻率統計偏大優化思路:使用多個數組,和多個哈希函數,來計算一個元素對應的數組的位置索引;那麼,要查詢某個元素的頻率時,返回這個元素在不一樣數組中的計數值中的最小值便可。
- 這個算法的特色是:
只會估算偏大,永遠不會偏小;
只須要固定大小的內存和計算時間,和須要統計的元素多少無關;
對於低頻的元素,估算值相對的錯誤可能會很大。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)