13.3 IntSet 整数集合
13.3.1 ADT(C#)
-
用接口封装类,相当于只开放类的部分功能
eg:
public interface ISet_my<T> { uint[] GetCoordinate(T element); uint[] Add(T element); //加入元素element,返回offset uint[] Remove(T element); //bool IsMember(T element); string GetBinString(); //get 二进制流,其实还是string流而不是bitString string PrintBinString(); //返回BinString string GetIntString(); //返回intString string PrintIntString(); ISet_my<T> Union(ISet_my<T> ISet_2); //并集 ISet_my<T> Intersect(ISet_my<T> ISet_2); //交集 ISet_my<T> DiffSet(ISet_my<T> ISet_2); //差集 ISet_my<T> Complement(); //补集 }
13.3.2 核心思想
IntSet (整数集合) 的核心思想就是压缩集合存储更多数据,比如:
用一个int32空间 存32个int
比起用32个int32空间 存32个int,IntSet的开销瞬间就小了是不是!
13.3.2 实现原理
-
bitMap(位图) 和 GetCoordinate()
public class IntSet_my : ISet_my <uint>
{
//member
private readonly uint[] _bitMap; //_bitMap的比特流表示IntSet存储信息
public uint _bitSize { get; } //_bitMap的比特流占多少位二进制
//contributor
public IntSet_my(uint bitSize_0)
{
_bitSize = bitSize_0;
_bitMap = new uint[_bitSize / 32 + 1]; //at lease 1 int32 to store IntSet
for (in