再看不懂BitMap算法,我请你吃饭(三)

用户信息的标签化

《漫画:Bitmap算法 整合版》写的非常好,一定要拜读下。这里,我想把文中提到的“用户信息的标签化”这个需求用代码实现一下。

系统维护一个标签字典表t_tag,可能有成百上千个标签,这里仅定义10个标签示意:

idtag
1
2
390后
400后
5程序员
6学生
7苹果
8三星
9小米
10华为

用户信息表t_user:

iduser_name
1小灰
2小黄
3小白

标签id、用户id关联表t_tag_user(多个用户id以英文逗号分割,无序):

tag_iduser_ids
11,2
23
31,2
43
52,1
63
71
82
93
import org.junit.Test;

import java.util.BitSet;

public class BitSetTest {

    /**
     *  统计总数:90后、且是程序员
     */
    @Test
    public void test4() {
        // TODO: 如何初始化nbits,待完善
        int nbits = 8;
        BitSet bitSet1 = new BitSet(nbits);

        // 1. select user_ids from t_tag_user where tag_id = 3
        // 2. 得到1,2
        bitSet1.set(1);
        bitSet1.set(2);

        // 3. select user_ids from t_tag_user where tag_id = 5
        // 4. 得到2,1
        BitSet bitSet2 = new BitSet(nbits);
        bitSet2.set(2);
        bitSet2.set(1);

        bitSet1.and(bitSet2);
        System.out.println("### 90后、且是程序员的总数:" + bitSet1.cardinality());
    }

    /**
     *  统计总数:00后、且是程序员
     */
    @Test
    public void test5() {
        // TODO: 如何初始化nbits,待完善
        int nbits = 8;
        BitSet bitSet1 = new BitSet(nbits);

        // 1. select user_ids from t_tag_user where tag_id = 4
        // 2. 得到3
        bitSet1.set(3);

        // 3. select user_ids from t_tag_user where tag_id = 5
        // 4. 得到2,1
        BitSet bitSet2 = new BitSet(nbits);
        bitSet2.set(2);
        bitSet2.set(1);

        bitSet1.and(bitSet2);
        System.out.println("### 00后、且是程序员的总数:" + bitSet1.cardinality());
    }

    /**
     *  统计总数:使用苹果手机、且是程序员
     */
    @Test
    public void test6() {
        // TODO: 如何初始化nbits,待完善
        int nbits = 8;
        BitSet bitSet1 = new BitSet(nbits);

        // 1. select user_ids from t_tag_user where tag_id = 7
        // 2. 得到1
        bitSet1.set(1);

        // 3. select user_ids from t_tag_user where tag_id = 5
        // 4. 得到2,1
        BitSet bitSet2 = new BitSet(nbits);
        bitSet2.set(2);
        bitSet2.set(1);

        bitSet1.and(bitSet2);
        System.out.println("### 使用苹果手机、且是程序员的总数:" + bitSet1.cardinality());
    }

    /**
     *  统计总数:男性,或者00后
     */
    @Test
    public void test7() {
        // TODO: 如何初始化nbits,待完善
        int nbits = 8;
        BitSet bitSet1 = new BitSet(nbits);

        // 1. select user_ids from t_tag_user where tag_id = 1
        // 2. 得到1,2
        bitSet1.set(1);
        bitSet1.set(2);

        // 3. select user_ids from t_tag_user where tag_id = 4
        // 4. 得到3
        BitSet bitSet2 = new BitSet(nbits);
        bitSet2.set(3);

        bitSet1.or(bitSet2);
        System.out.println("### 男性,或者00后的总数:" + bitSet1.cardinality());
    }

    /**
     *  统计总数:非90后
     *  等效于:90后 异或 全量用户
     */
    @Test
    public void test8() {
        // TODO: 如何初始化nbits,待完善
        int nbits = 8;
        BitSet bitSet1 = new BitSet(nbits);

        // 1. select user_ids from t_tag_user where tag_id = 3
        // 2. 得到1,2
        bitSet1.set(1);
        bitSet1.set(2);

        // 3. select distinct id from t_user
        // 4. 得到1,2,3
        BitSet bitSet2 = new BitSet(nbits);
        bitSet2.set(1);
        bitSet2.set(2);
        bitSet2.set(3);

        bitSet2.xor(bitSet1);
        System.out.println("### 非90后的总数:" + bitSet2.cardinality());
    }
}
如何初始化BitSet(int nbits)中的nbits

以t_tag_user表user_ids列中,最大的那个user_id,作为nbits。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值