数据结构:整数集合

整数集合

  • 整数集合的定义:由若干互不相同的正整数组成的集合,其中全集为0至MaxRangeMaxRange为构成该集合元素的最大值

整数集合的操作:

  • 向集合中添加元素

  • 删除集合中的元素

  • 判断元素是否属于该集合

  • 得到集合中的所有元素

  • 求两个集合的并集

  • 求两个集合的交集

  • 求两个集合的差集

  • 求集合的补集
    在这里插入图片描述

  • T:集合中元素的数据类型,对于整数集合来说是无符号整型uint

  • TK:集合

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
发布了73 篇原创文章 · 获赞 2 · 访问量 3147

猜你喜欢

转载自blog.csdn.net/soulmate______/article/details/105107597