整数集合

it2026-10-01  9

使用场景

当集合里面只包含整数并且集合数量较小的时候就用intset,为啥还必须说明集合较小的时候呢?因为如果集合较大,这时候再把key转换为string工作量就比较大了

实现

typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset;

如果老老实实通过contents[x]的方式赋值取值,我们就不需要考虑这个字节序的问题,但是intset根据encoding的值指定元素的地址偏移,暴力地对内存进行操作。若数据被截断了,则大端机器和小端机器会表现出不统一的状况。为了避免这种情况发生,intset不管在什么机器上都按照同一种字节序(小端)在内存中存intset的成员变量。

编码

编码方式可以是int16,int32,int64,int8_t并不是元素的类型,元素类型取决于encoding。因为c是扁平数据结构,可以直接把encoding对应的数据内存copy进去,所以直接强转contents的类型就行了

升级首先要做的是, 根据新类型的长度, 以及集合元素的数量(包括要添加的新元素在内), 对底层数组进行空间重分配。

数组一旦升级,不会降级,本来就是小数量场景的简化方案。

intsetNew 创建一个新的整数集合。 O(1) intsetAdd 将给定元素添加到整数集合里面。 O(N) intsetRemove 从整数集合中移除给定元素。 O(N) intsetFind 检查给定值是否存在于集合。 因为底层数组有序,查找可以通过二分查找法来进行, 所以复杂度为 O(log N) 。

最新回复(0)