bitmap算法 java_【转载】Bitmap算法

点击上方"java全栈技术"关注,每天学习一个java知识点

0f18dc1aa4cb122216ac3864c78eacc1.png

7c3afdc477f325064527c5f4daaec9b2.png

4a84350eb419431e838a848931bdbcc4.png

6745669a0b333db89be24ab7b499f4c6.png

两个月之前——

996d34173335840e2168c9dd5c770c0d.png

3dcfe9b6df25e09769f752116623081d.png

14c88f52fcbc7b3e0f66de7d8a696c55.png

882cd1d33fa6955c7811361f4cf024c6.png

71dc1867b39665d68eb55d65109fe535.png

为满足用户标签的统计需求,小灰利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mysql表的一列:

9e1a81a9407cf5c03151b31a1d25a58a.png

要想统计所有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后' ;

53394b5d43a0a5a3f05712e6073ccfed.png

两个月之后——

2d9db4e9108ee66ac90a0eae15f7ce0a.png

589cac8c99d0cedbc0012c94050dac35.png

cdfc9e68cd20c17ac661c8eb57f89488.png

6a3bf707f6bba752e76c1ddadbd53992.png

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

827f7458b420ccb4a096cdef28da94db.png

6514cf79eb6becc95372f2acd266b7cd.png

2ba96614181a4a0d15119f5cd82ed427.png

d95a5c92564228ab2f56c79a87bcc514.png

7bfdc79299347bf661296f54844c4a15.png

1. 给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
雪花算法是一种生成分布式唯一ID的算法,可以保证生成的ID在分布式系统中的唯一性。而Bitmap算法则是一种数据压缩算法,如何将这两个算法结合起来呢? 实际上,在雪花算法中,每个ID都是由时间戳、机器ID和序列号组成的。因此,我们可以将机器ID和序列号使用Bitmap算法进行压缩,从而减小ID的存储空间。 具体来说,我们可以使用两个Bitmap,一个用于存储机器ID,一个用于存储序列号。假设机器ID和序列号分别需要存储10位和12位,那么我们可以定义两个长度为(2^10)/8=128和(2^12)/8=256的byte数组,分别用于存储机器ID和序列号。 在生成ID时,先根据雪花算法生成一个64位的ID,然后将其中的机器ID和序列号分别使用Bitmap算法进行压缩,最终将压缩后的结果拼接成一个新的ID,并返回。 下面是一个简单的Java实现示例: ```java public class SnowflakeIdGenerator { private long lastTimestamp = -1L; private long sequence = 0L; private long workerId; private Bitmap workerIdBitmap; private Bitmap sequenceBitmap; public SnowflakeIdGenerator(long workerId) { this.workerId = workerId; this.workerIdBitmap = new Bitmap(1 << 10); this.sequenceBitmap = new Bitmap(1 << 12); } public synchronized long nextId() { long timestamp = System.currentTimeMillis(); if (timestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards"); } if (timestamp == lastTimestamp) { sequence = (sequence + 1) & 0xFFF; if (!sequenceBitmap.get((int) sequence)) { sequenceBitmap.set((int) sequence); } else { return nextId(); } } else { sequence = 0L; sequenceBitmap = new Bitmap(1 << 12); } lastTimestamp = timestamp; if (!workerIdBitmap.get((int) workerId)) { workerIdBitmap.set((int) workerId); } long id = ((timestamp << 22) | (workerId << 12) | sequence); return id; } } ``` 在上面的示例中,我们定义了一个SnowflakeIdGenerator类,其中包含一个机器ID和两个Bitmap。在nextId方法中,先使用雪花算法生成一个原始的64位ID,然后将其中的机器ID和序列号压缩到对应的Bitmap中,最终拼接成一个新的ID,并返回。 需要注意的是,在压缩机器ID和序列号时,我们使用了两个长度分别为1 << 10和1 << 12的Bitmap。这是因为机器ID和序列号的位数分别为10位和12位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值