转:C#数据结构和算法学习系列十四----集合

所谓集合是特殊元素们的一种聚合。集合的元素被称为是成员。集合有两 个最重要的属性,一个是集合成员都是无序的,另一个则是集合的成员不会出现超过一次。本节讨论用散列表作为潜在的数据存储来提供一种十分简单的实现。用这 种实现所产生的问题就是它的效率问题。人们把集合定义成相关成员的无序聚集,而且集合中的成员不会出现超过一次。集合书写成用一对闭合大括号包裹成员列表 的形式,例如{0,1,2,3,4,5,6,7,8,9}。只要全部成员只书写一次,就可以按照任意顺序书写集合。

1.集合的散列实现。

  1. public class CSet  
  2. {  
  3.      private Hashtable data;  
  4.      public CSet()  
  5.      {  
  6.           data = new Hashtable();  
  7.      }  
  8.      public void Add(Object item)//添加成员  
  9.      {  
  10.           if (!data.ContainsValue(item))  
  11.                data.Add(Hash(item), item);  
  12.      }  
  13.      public void Remove(Object item)//移除成员  
  14.      {  
  15.           data.Remove(Hash(item));  
  16.      }  
  17.      public int Size()//集合大小  
  18.      {  
  19.           return data.Count;  
  20.      }  
  21.      public CSet Union(CSet aSet)//合并集合  
  22.      {  
  23.           CSet tempSet = new CSet();  
  24.           foreach (Object hashObject in data.Keys)  
  25.                tempSet.Add(this.data[hashObject]);  
  26.           foreach (Object hashObject in aSet.data.Keys)  
  27.                if (!(this.data.ContainsKey(hashObject)))  
  28.                     tempSet.Add(aSet.data[hashObject]);  
  29.           return tempSet;  
  30.      }  
  31.      public CSet Intersection(CSet aSet)//检查是否会在传递的集合内找到该关键字  
  32.      {  
  33.           CSet tempSet = new CSet();  
  34.           foreach (Object hashObject in data.Keys)  
  35.           if (aSet.data.Contains(hashObject))  
  36.                tempSet.Add(aSet.data[hashObject]);  
  37.           tempSet.Add(aSet.GetValue(hashObject))  
  38.           return tempSet;  
  39.      }  
  40.      public bool Subset(CSet aSet)//检查一个集合是否包含另一个集合  
  41.      {  
  42.           if (this.Size() > aSet.Size())  
  43.                return false;  
  44.           else  
  45.                foreach (Object key in this.data.Keys)  
  46.                     if (!(aSet.data.Contains(key)))  
  47.                          return false;  
  48.           return true;  
  49.      }  
  50. }  

测试代码如下:

  1. static void Main()  
  2. {  
  3.      CSet setA = new CSet();  
  4.      CSet setB = new CSet();  
  5.      setA.Add(" milk");  
  6.      setA.Add(" eggs");  
  7.      setA.Add(" bacon");  
  8.      setA.Add(" cereal");  
  9.      setB.Add(" bacon");  
  10.      setB.Add(" eggs");  
  11.      setB.Add(" bread");  
  12.      CSet setC = new CSet();  
  13.      setC = setA.Union(setB);  
  14.      Console.WriteLine();  
  15.      Console.WriteLine("A: " + setA.ToString());  
  16.      Console.WriteLine("B: " + setB.ToString());  
  17.      Console.WriteLine("A union B: " + setC.ToString());  
  18.      setC = setA.Intersection(setB);  
  19.      Console.WriteLine("A intersect B: " + setC.ToString());  
  20.      setC = setA.Difference(setB);  
  21.      Console.WriteLine("A diff B: " + setC.ToString());  
  22.      setC = setB.Difference(setA);  
  23.      Console.WriteLine("B diff A: " + setC.ToString());  
  24.      if (setB.Subset(setA))  
  25.           Console.WriteLine("b is a subset of a");  
  26.      else  
  27.           Console.WriteLine("b is not a subset of a");  

posted @ 2011-11-07 16:05  追_bk  阅读(177)  评论(0编辑  收藏  举报