您的位置:首页 > 理论基础 > 数据结构算法

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

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


1.集合的散列实现。

public class CSet

{

private Hashtable data;

public CSet()

{

data = new Hashtable();

}

public void Add(Object item)//添加成员

{

if (!data.ContainsValue(item))

data.Add(Hash(item), item);

}

public void Remove(Object item)//移除成员

{

data.Remove(Hash(item));

}

public int Size()//集合大小

{

return data.Count;

}

public CSet Union(CSet aSet)//合并集合

{

CSet tempSet = new CSet();

foreach (Object hashObject in data.Keys)

tempSet.Add(this.data[hashObject]);

foreach (Object hashObject in aSet.data.Keys)

if (!(this.data.ContainsKey(hashObject)))

tempSet.Add(aSet.data[hashObject]);

return tempSet;

}

public CSet Intersection(CSet aSet)//检查是否会在传递的集合内找到该关键字

{

CSet tempSet = new CSet();

foreach (Object hashObject in data.Keys)

if (aSet.data.Contains(hashObject))

tempSet.Add(aSet.data[hashObject]);

tempSet.Add(aSet.GetValue(hashObject))

return tempSet;

}

public bool Subset(CSet aSet)//检查一个集合是否包含另一个集合

{

if (this.Size() > aSet.Size())

return false;

else

foreach (Object key in this.data.Keys)

if (!(aSet.data.Contains(key)))

return false;

return true;

}

}

测试代码如下:

static void Main()

{

CSet setA = new CSet();

CSet setB = new CSet();

setA.Add(" milk");

setA.Add(" eggs");

setA.Add(" bacon");

setA.Add(" cereal");

setB.Add(" bacon");

setB.Add(" eggs");

setB.Add(" bread");

CSet setC = new CSet();

setC = setA.Union(setB);

Console.WriteLine();

Console.WriteLine("A: " + setA.ToString());

Console.WriteLine("B: " + setB.ToString());

Console.WriteLine("A union B: " + setC.ToString());

setC = setA.Intersection(setB);

Console.WriteLine("A intersect B: " + setC.ToString());

setC = setA.Difference(setB);

Console.WriteLine("A diff B: " + setC.ToString());

setC = setB.Difference(setA);

Console.WriteLine("B diff A: " + setC.ToString());

if (setB.Subset(setA))

Console.WriteLine("b is a subset of a");

else

Console.WriteLine("b is not a subset of a");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: