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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

BitMap、RoaringBitmap与JavaEWAH

發布時間:2023/12/15 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 BitMap、RoaringBitmap与JavaEWAH 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹BitMap的算法思想,以及開源工具類JavaEWAH、RoaringBitmap的簡單用法。

一、BitMap

介紹

BitMap使用bit位,來標記元素對應的Value。該算法能夠節省存儲空間

假設一個場景,要存0-7以內的數字[3,5,6,1,2],盡可能的節省空間。
一種思路就是單純使用數組存儲,但如果數據量放大百萬倍甚至千萬倍呢,數組的所占用的內存會非常大。
另一種思路是使用BitMap

表示[3,5,7,1,2],我們可以用8bit的空間來存儲,每個數字都在對應的位置中以1的方式表示。

位置7 位置 6 位置 5 位置 4 位置 3 位置 2 位置 1 位置 0
1 0 1 0 1 1 1 0

若將上述BitMap看作是存儲用戶的標簽,如信用卡逾期標簽,位置看成用戶ID,則若需要查詢哪些用戶有信用卡逾期的行為(標簽),就非常容易查詢統計了。

二、RoaringBitmap

文檔中怎么說?

Bitsets, also called bitmaps, are commonly used as fast data structures. Unfortunately, they can use too much memory. To compensate, we often use compressed bitmaps.

BitMap通常被用作快速查詢的數據結構,但它太占內存了。解決方案是,對BitMap進行壓縮。

Roaring bitmaps are compressed bitmaps which tend to outperform conventional compressed bitmaps such as WAH, EWAH or Concise. In some instances, roaring bitmaps can be hundreds of times faster and they often offer significantly better compression. They can even be faster than uncompressed bitmaps.

Roaring bitmaps是一種超常規的壓縮BitMap。它的速度比未壓縮的BitMap快上百倍。

簡單使用

引入依賴


		<dependency>
            <groupId>org.roaringbitmap</groupId>
            <artifactId>RoaringBitmap</artifactId>
            <version>0.8.1</version>
        </dependency>

測試代碼


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestRoaringbitmap {

    @Test
    public void test(){
		
		//向rr中添加1、2、3、1000四個數字
        RoaringBitmap rr = RoaringBitmap.bitmapOf(1,2,3,1000);
        //創建RoaringBitmap rr2
        RoaringBitmap rr2 = new RoaringBitmap();
        //向rr2中添加10000-12000共2000個數字
        rr2.add(10000L,12000L);
        //返回第3個數字是1000,第0個數字是1,第1個數字是2,則第3個數字是1000
        rr.select(3); 
        //返回value = 2 時的索引為 1。value = 1 時,索引是 0 ,value=3的索引為2
        rr.rank(2); 
        //判斷是否包含1000
        rr.contains(1000); // will return true
        //判斷是否包含7
        rr.contains(7); // will return false
		
		//兩個RoaringBitmap進行or操作,數值進行合并,合并后產生新的RoaringBitmap叫rror
        RoaringBitmap rror = RoaringBitmap.or(rr, rr2);
        //rr與rr2進行位運算,并將值賦值給rr
        rr.or(rr2); 
        //判斷rror與rr是否相等,顯然是相等的
        boolean equals = rror.equals(rr);
        if(!equals) throw new RuntimeException("bug");
        // 查看rr中存儲了多少個值,1,2,3,1000和10000-12000,共2004個數字
        long cardinality = rr.getLongCardinality();
        System.out.println(cardinality);
        //遍歷rr中的value
        for(int i : rr) {
            System.out.println(i);
        }
        //這種方式的遍歷比上面的方式更快
        rr.forEach((Consumer<? super Integer>) i -> {
            System.out.println(i.intValue());
        });

    }

}

三、JavaEWAH

引入依賴


			<dependency>
                <groupId>com.googlecode.javaewah</groupId>
                <artifactId>JavaEWAH</artifactId>
                <version>1.1.6</version>
            </dependency>

測試代碼


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestJavaEWAH {

    @Test
    public void test(){
    
        EWAHCompressedBitmap ewahBitmap1 = EWAHCompressedBitmap.bitmapOf(0, 2, 55, 64, 1 << 30);
        EWAHCompressedBitmap ewahBitmap2 = EWAHCompressedBitmap.bitmapOf(1, 3, 64,1 << 30);
        //bitmap 1: {0,2,55,64,1073741824}
        System.out.println("bitmap 1: " + ewahBitmap1);
        //bitmap 2: {1,3,64,1073741824}
        System.out.println("bitmap 2: " + ewahBitmap2);

        //是否包含value=64,返回為true
        System.out.println(ewahBitmap1.get(64));

        //獲取value的個數,個數為5
        System.out.println(ewahBitmap1.cardinality());
        
        //遍歷所有value
        ewahBitmap1.forEach(integer -> {
            System.out.println(integer);
        });


        //進行位或運算
        EWAHCompressedBitmap orbitmap = ewahBitmap1.or(ewahBitmap2);
        //返回bitmap 1 OR bitmap 2: {0,1,2,3,55,64,1073741824}
        System.out.println("bitmap 1 OR bitmap 2: " + orbitmap);
        //memory usage: 40 bytes
        System.out.println("memory usage: " + orbitmap.sizeInBytes() + " bytes");

        //進行位與運算
        EWAHCompressedBitmap andbitmap = ewahBitmap1.and(ewahBitmap2);
        //返回bitmap 1 AND bitmap 2: {64,1073741824}
        System.out.println("bitmap 1 AND bitmap 2: " + andbitmap);
        //memory usage: 32 bytes
        System.out.println("memory usage: " + andbitmap.sizeInBytes() + " bytes");

        //序列化與反序列化
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ewahBitmap1.serialize(new DataOutputStream(bos));
            EWAHCompressedBitmap ewahBitmap1new = new EWAHCompressedBitmap();
            byte[] bout = bos.toByteArray();
            ewahBitmap1new.deserialize(new DataInputStream(new ByteArrayInputStream(bout)));
            System.out.println("bitmap 1 (recovered) : " + ewahBitmap1new);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

參考文檔

[1]: BitMap算法詳解
[2]: 漫畫:Bitmap算法 整合版
[3]: RoaringBitmap GitHub項目文檔
[4]: JavaEWAH GitHub項目文檔

總結

以上是生活随笔為你收集整理的BitMap、RoaringBitmap与JavaEWAH的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费黄色网址观看 | 色七七在线 | 久久综合伊人77777麻豆最新章节 | 国产精品一卡二卡三卡 | 欧美大片一区二区三区 | 91av免费观看 | 中文字幕人妻一区二区三区在线视频 | 欧美天堂在线观看 | 日韩福利片 | 欧美高h视频 | 日本精品久久 | 欧美大尺度床戏做爰 | 影音先锋亚洲一区 | 抖音视频在线观看 | 黄网站欧美内射 | 成人亚洲国产 | 一级aaaa毛片 | av怡红院 | 超碰在线国产97 | www.色日本 | 日韩精品第一区 | 99国产精品视频免费观看一公开 | 色网站在线 | 7799精品视频 | 午夜激情小视频 | 久久久久不卡 | 久99视频| 麻豆激情视频 | 欧美一区二区三区久久成人精品 | 久久国产精品久久 | 久久大| 欧美性aaa| 成人av网页 | 小宝贝真紧h军人h | 99久久久无码国产精品衣服 | 国产精品无码毛片 | 高hhhhh| 天堂在线亚洲 | 国产乱国产乱老熟300部视频 | 二区在线视频 | 欧美视频久久 | 男操女视频网站 | 久久这里只有精品23 | 无码精品国产一区二区三区 | 99久久久无码国产 | 香蕉视频最新网址 | 欧美另类z0zx974 | 日本高清网站 | 久久99网| 影音先锋成人资源 | 欧洲激情网 | 一级大片免费观看 | 成人性免费视频 | 欧美一区二区三区激情 | 久久精品无码人妻 | 久久99久久99精品蜜柚传媒 | 人妻奶水人妻系列 | 日韩精品人妻一区二区中文字幕 | 亚洲黄色小说网 | 国内精品久久久久久 | 欧美视频免费在线观看 | 国产又黄又大又爽 | 国产一区二区视频免费观看 | 97国产精品人人爽人人做 | 日日摸夜夜添夜夜添高潮喷水 | 国产女教师bbwbbwbbw | 91丨九色丨蝌蚪丨对白 | 91久色| 最新毛片网 | av中文网 | 精品一区二区三区不卡 | jizz内谢中国亚洲jizz | 黄色片子一级 | 午夜宅男在线 | 国产在线精品一区 | 两个小y头稚嫩紧窄h文 | 人妻久久一区二区 | 在线播放波多野结衣 | av导航福利 | 九九热精品在线视频 | 欧美久久久久久久久久 | 成人一区二区电影 | 欧美jizzhd欧美18| 免费成人黄色av | 久久久久国产精品午夜一区 | 国产亚洲欧美一区二区 | 国产原创剧情av | 国产黄色免费网站 | 特大黑人娇小亚洲女mp4 | 国模无码国产精品视频 | 热久久这里只有精品 | 日本亚洲欧美 | 亚洲看 | 毛片xxx| 女人的毛片 | 国产在线播放网站 | 老司机午夜性大片 | 影音先锋激情 | 久久av红桃一区二区小说 |