日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画:Bitmap算法 整合版

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:Bitmap算法 整合版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??玻璃貓 程序員小灰









兩個月之前——













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



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


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


Select count(distinct Name) as 用戶數 from table whare age = '90后' and Occupation = '程序員' ;



要想統計所有使用蘋果手機或者00后的用戶總合該怎么做?


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


Select count(distinct Name) as 用戶數 from table whare 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后的用戶?




















一周之后......











我們以上一期的用戶數據為例,用戶基本信息如下。按照年齡標簽,可以劃分成90后、00后兩個Bitmap:





用更加形象的表示,90后用戶的Bitmap如下:




這時候可以直接求得90后的用戶嗎?直接進行非運算?




顯然,非90后用戶實際上只有1個,而不是圖中得到的8個結果,所以不能直接進行非運算。







同樣是剛才的例子,我們給定90后用戶的Bitmap,再給定一個全量用戶的Bitmap。最終要求出的是存在于全量用戶,但又不存在于90后用戶的部分。





如何求出呢?我們可以使用異或操作,即相同位為0,不同位為1。







































































25769803776L ?= ?11000000000000000000000000000000000B

8589947086L =?1000000000000000000011000011001110B















1.解析Word0,得知當前RLW橫跨的空Word數量為0,后面有連續3個普通Word。


2.計算出當前RLW后方連續普通Word的最大ID是 ?64 X ?(0 + 3) -1 = 191。


3. 由于 191 < 400003,所以新ID必然在下一個RLW(Word4)之后。


4.解析Word4,得知當前RLW橫跨的空Word數量為6247,后面有連續1個普通Word。


5.計算出當前RLW(Word4)后方連續普通Word的最大ID是191 + (6247 + 1)X64 ?= 400063。


6.由于400003 < 400063,因此新ID 400003的正確位置就在當前RLW(Word4)的后方普通Word,也就是Word5當中。


最終插入結果如下:




?









官方說明如下:


*?Though?you?can?set?the?bits?in?any?order?(e.g.,?set(100),?set(10),?set(1),*?you?will?typically?get?better?performance?if?you?set?the?bits?in?increasing?order?(e.g.,?set(1),?set(10),?set(100)).*?*?Setting?a?bit?that?is?larger?than?any?of?the?current?set?bit*?is?a?constant?time?operation.?Setting?a?bit?that?is?smaller?than?an?*?already?set?bit?can?require?time?proportional?to?the?compressed*?size?of?the?bitmap,?as?the?bitmap?may?need?to?be?rewritten.



幾點說明:


1. 該項目最初的技術選型并非Mysql,而是內存數據庫hana。本文為了便于理解,把最初的存儲方案寫成了Mysq數據庫。


1.文中介紹的Bitmap優化方法在一定程度上做了簡化,源碼中的邏輯要復雜得多。比如對于插入數據400003的定位,和實際步驟是有出入的。


2.如果同學們有興趣,可以親自去閱讀源碼,甚至是嘗試實現自己的Bitmap算法。雖然要花不少時間,但這確實是一種很好的學習方法。

EWAHCompressedBitmap對應的maven依賴如下:

12345<dependency>??<groupId>com.googlecode.javaewah</groupId>??<artifactId>JavaEWAH</artifactId>??<version>1.1.0</version></dependency>



—————END—————



總結

以上是生活随笔為你收集整理的漫画:Bitmap算法 整合版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。