什么是Bitmap算法?


本文的靈感來源於京東金融數據部張洪雨同學的項目經歷,感謝這位大神的技術分享。

為滿足用戶標簽的統計需求,小灰利用 MySQL 設計了如下的表結構,每一個維度的標簽都對應着 MySQL 表的一列:

要想統計所有 90 后的程序員該怎么做呢?

用一條求交集的 SQL 語句即可:

SELECT COUNT(DISTINCT name) AS 用戶數 FROM table WHERE age = '90后' AND occupation = '程序員'

要想統計所有使用蘋果手機或者 00 后的用戶總合該怎么做?用一條求並集的 SQL 語句即可:

SELECT COUNT(DISTINCT name) AS 用戶數 FROM table WHERE phone = '蘋果' OR age = '00后'

兩個月之后——

———————————————

1.給定長度是 10 的 bitmap,每一個 bit 位分別對應着從 0 到 9 的 10 個整型數。此時 bitmap 的所有位都是 0。

2.把整型數 4 存入 bitmap,對應存儲的位置就是下標為 4 的位置,將此 bit 置為 1。

3.把整型數 2 存入 bitmap,對應存儲的位置就是下標為 2 的位置,將此 bit 置為 1。

4.把整型數 1 存入 bitmap,對應存儲的位置就是下標為 1 的位置,將此 bit 置為 1。

5.把整型數 3 存入 bitmap,對應存儲的位置就是下標為 3 的位置,將此 bit 置為 1。

要問此時 bitmap 里存儲了哪些元素?顯然是 4,3,2,1,一目了然。

bitmap 不僅方便查詢,還可以去除掉重復的整型數。

1.建立用戶名和用戶 ID 的映射。

2.讓每一個標簽存儲包含此標簽的所有用戶 ID,每一個標簽都是一個獨立的 bitmap。

3.這樣,實現用戶的去重和查詢統計,就變得一目了然。

1.如何查找使用蘋果手機的程序員用戶?

2.如何查找所有男性或者00后的用戶?

說明:該項目最初的技術選型並非 MySQL,而是內存數據庫 hana。本文為了便於理解,把最初的存儲方案寫成了 MySQL 數據庫。

 

轉載:樊浩柏科學院


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM