首先看下intset的定义
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
encoding: 集合的元素使用的什么什么编码,有以下三种
#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))
length:元素的个数
contents:contents的长度总是等于 length*encoding
分析intset相关操作
添加元素分两种情况:1.正常添加 2.需要转换编码
正常添加:resize一下intset大小,contents[length++*encoding] = value
需要转换编码:
1.先重新resize大小
2.从后往前move数据
3.在合适的位置插入value
删除元素:
1.先定位到元素位置
2.把元素跟最后一个元素交换
3.resize(length-1)
/*个人疑问 为何不考虑预分配和惰性释放*/
查找元素:时间复杂度为O(N)
intset的优点
1. 提升了灵活性 可以存储int16 int32 int64三种类型整数
2. 节约内存 只有插入更大的整数时 才会进行扩容
intset的缺点
1. inset不支持降级 可能造成内存的浪费 = = (和节约内存关注的角度不同)
2. 查找需要O(N)