整数集合
- 整数集合的定义:由若干互不相同的正整数组成的集合,其中全集为0至
MaxRange
,MaxRange
为构成该集合元素的最大值
整数集合的操作:
using System;
using System.Collections.Generic;
using System.Text;
namespace 整数集合
{
public interface ISet<T,TK>
{
void Insert(T elt);
void Remove(T elt);
bool IsMember(T elt);
TK Complement();
TK Union(TK b);
TK Intersect(TK b);
TK DiffSet(TK b);
string GetElements();
}
}
整数集合的存储和实现
利用数组进行存储
- 若整数集合为An = {0,1,2,…,n- 1 },则其子集也必须存放在长度为n的数组中
- 全集:uint[] A = new uint[n]; 元素全部赋值1
- 空集:uint[] A = new uint[n]; 元素全部赋值0
利用二进制实现整数集合
using System;
using System.Collections.Generic;
using System.Text;
namespace 整数集合
{
public class IntSet : ISet<uint, IntSet>
{
private uint[] _bitSet;
private uint _maxRange;
public uint MaxRange
{
get { return _maxRange; }
}
public IntSet(uint maxRange)
{
_maxRange = maxRange;
_bitSet = new uint[maxRange / 32 + 1];
}
private uint ArrayIndex(uint elt)
{
if (elt > _maxRange)
throw new ArgumentOutOfRangeException();
return elt / 32;
}
private uint BitMask(uint elt)
{
if (elt > _maxRange)
throw new ArgumentOutOfRangeException();
return (uint)Math.Pow(2, elt % 32);
}
public void Insert(uint elt)
{
if (elt > _maxRange)
throw new ArgumentOutOfRangeException();
_bitSet[ArrayIndex(elt)] |= BitMask(elt);
}
public void Remove(uint elt)
{
if (elt > _maxRange)
throw new ArgumentOutOfRangeException();
_bitSet[ArrayIndex(elt)] &= ~BitMask(elt);
}
public bool IsMember(uint elt)
{
if (elt > _maxRange)
throw new ArgumentOutOfRangeException();
return (_bitSet[ArrayIndex(elt)] & BitMask(elt)) != 0;
}
public IntSet Complement()
{
IntSet result = new IntSet(_maxRange);
for (int i = 0; i < _bitSet.Length; i++)
{
result._bitSet[i] = ~_bitSet[i];
}
return result;
}
public IntSet Union(IntSet b)
{
if (b == null)
throw new ArgumentNullException();
if (b.MaxRange != _maxRange)
throw new Exception("MaxRange不同");
IntSet result = new IntSet(_maxRange);
for (int i = 0; i < _bitSet.Length; i++)
{
result._bitSet[i] = _bitSet[i] | b._bitSet[i];
}
return result;
}
public IntSet Intersect(IntSet b)
{
if (b == null)
throw new ArgumentNullException();
if (b.MaxRange != _maxRange)
throw new Exception("MaxRange不同");
IntSet result = new IntSet(_maxRange);
for (int i = 0; i < _bitSet.Length; i++)
{
result._bitSet[i] = _bitSet[i] & b._bitSet[i];
}
return result;
}
public IntSet DiffSet(IntSet b)
{
if (b == null)
throw new ArgumentNullException();
if (b.MaxRange != _maxRange)
throw new Exception("MaxRange不同");
IntSet result = new IntSet(_maxRange);
for (int i = 0; i < _bitSet.Length; i++)
{
result._bitSet[i] = _bitSet[i] & ~b._bitSet[i];
}
return result;
}
public string GetBitString()
{
string str = string.Empty;
for (int i = 0; i < _bitSet.Length; i++)
{
str = Convert.ToString(_bitSet[i], 2).PadLeft(32,'0') + str;
}
str = str.Remove(0, (int)(32 - (_maxRange % 32 + 1)));
return str;
}
public string GetElements()
{
string str = GetBitString();
string result = string.Empty;
int j = 0;
for (int i = str.Length - 1; i >= 0; i--)
{
if (str[i] == '1')
{
result += j + " ";
}
j++;
}
return result;
}
}
}
using System;
namespace 整数集合
{
class Program
{
static void Main(string[] args)
{
IntSet seta = new IntSet(33);
IntSet setb = new IntSet(33);
seta.Insert(5);
seta.Insert(30);
seta.Insert(23);
setb.Insert(5);
setb.Insert(24);
setb.Insert(9);
Console.WriteLine(seta.GetBitString());
Console.WriteLine(seta.GetElements());
Console.WriteLine(setb.GetBitString());
Console.WriteLine(setb.GetElements());
0001000000100000000000000000100000
5 23 30
0000000001000000000000001000100000
5 9 24
}
}
}
using System;
namespace 整数集合
{
class Program
{
static void Main(string[] args)
{
IntSet seta = new IntSet(33);
IntSet setb = new IntSet(33);
seta.Insert(5);
seta.Insert(30);
seta.Insert(23);
setb.Insert(5);
setb.Insert(24);
setb.Insert(9);
IntSet setc = seta.Union(setb);
Console.WriteLine(seta.GetBitString());
Console.WriteLine(seta.GetElements());
Console.WriteLine(setb.GetBitString());
Console.WriteLine(setb.GetElements());
Console.WriteLine(setc.GetBitString());
Console.WriteLine(setc.GetElements());
}
}
}
0001000000100000000000000000100000
5 23 30
0000000001000000000000001000100000
5 9 24
0001000001100000000000001000100000
5 9 23 24 30
using System;
namespace 整数集合
{
class Program
{
static void Main(string[] args)
{
IntSet seta = new IntSet(33);
IntSet setb = new IntSet(33);
seta.Insert(5);
seta.Insert(30);
seta.Insert(23);
setb.Insert(5);
setb.Insert(24);
setb.Insert(9);
IntSet setd = seta.Intersect(setb);
Console.WriteLine(seta.GetBitString());
Console.WriteLine(seta.GetElements());
Console.WriteLine(setb.GetBitString());
Console.WriteLine(setb.GetElements());
Console.WriteLine(setd.GetBitString());
Console.WriteLine(setd.GetElements());
}
}
}
0001000000100000000000000000100000
5 23 30
0000000001000000000000001000100000
5 9 24
0000000000000000000000000000100000
5
using System;
namespace 整数集合
{
class Program
{
static void Main(string[] args)
{
IntSet seta = new IntSet(33);
IntSet setb = new IntSet(33);
seta.Insert(5);
seta.Insert(30);
seta.Insert(23);
setb.Insert(5);
setb.Insert(24);
setb.Insert(9);
IntSet sete = seta.DiffSet(setb);
Console.WriteLine(seta.GetBitString());
Console.WriteLine(seta.GetElements());
Console.WriteLine(setb.GetBitString());
Console.WriteLine(setb.GetElements());
Console.WriteLine(sete.GetBitString());
Console.WriteLine(sete.GetElements());
}
}
}
0001000000100000000000000000100000
5 23 30
0000000001000000000000001000100000
5 9 24
0001000000100000000000000000000000
23 30