概念
整数集合(intset)是一个有序的、存储整型数据的结构。
关键字:有序的、整型的
conding决定了的element的长度,对应关系如下
基本结构
intset
1 2 3 4 5 6 7 8
| typedef struct intset { uint32_t encoding; uint32_t length; int8_t contents[]; } intset;
|
可以看到底层是通过数组实现
基本操作
查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| uint8_t intsetFind(intset *is, int64_t value) { uint8_t valenc = _intsetValueEncoding(value); return valenc <= intrev32ifbe(is->encoding) && intsetSearch(is,value,NULL); }
static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) { int min = 0, max = intrev32ifbe(is->length)-1, mid = -1; int64_t cur = -1; if (intrev32ifbe(is->length) == 0) { if (pos) *pos = 0; return 0; } else { if (value > _intsetGet(is,max)) { if (pos) *pos = intrev32ifbe(is->length); return 0; } else if (value < _intsetGet(is,0)) { if (pos) *pos = 0; return 0; } }
while(max >= min) { mid = ((unsigned int)min + (unsigned int)max) >> 1; cur = _intsetGet(is,mid); if (value > cur) { min = mid+1; } else if (value < cur) { max = mid-1; } else { break; } }
if (value == cur) { if (pos) *pos = mid; return 1; } else { if (pos) *pos = min; return 0; } } }
|
其实比较简单,就是先做了一些基础的结构判断,因为是有序的可以通过二分查找快速查询。
总结
这应该是最简单的一个类型了,就是一个基于数组的有序集合,增删改查都使用到了二分查找。
致谢