转: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");
}
个最重要的属性,一个是集合成员都是无序的,另一个则是集合的成员不会出现超过一次。本节讨论用散列表作为潜在的数据存储来提供一种十分简单的实现。用这
种实现所产生的问题就是它的效率问题。人们把集合定义成相关成员的无序聚集,而且集合中的成员不会出现超过一次。集合书写成用一对闭合大括号包裹成员列表
的形式,例如{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");
}
相关文章推荐
- 转:C#数据结构和算法学习系列十一----构建字典DictionaryBase 类和SortedList 类
- 转:C#数据结构和算法学习系列十二----散列HashTable类
- 转:C#数据结构和算法学习系列十三----链表
- 转:C#数据结构和算法学习系列九----String类和StringBuilder类
- 转:C#数据结构和算法学习系列十----正则表达式
- 数据结构与算法(C#实现)系列---二叉树
- C#数据结构和算法学习系列十四----集合
- JAVA与C#对照学习系列 —— 数据结构
- 数据结构与算法(C#实现)系列---二叉树
- 数据结构与算法(C#实现)系列---AVLTree(二)(外摘)
- 数据结构与算法(C#实现)系列---演示篇(一)(外摘)
- c# 数据结构算法学习一:冒泡排序
- [翻译]C#数据结构与算法 – 第五章栈与队列(Part 1)
- 数据结构与算法:python语言描述学习笔记Part2
- 数据结构与算法之三 深入学习排序
- 数据结构与算法学习--链表
- [翻译]C#数据结构与算法 – 第二章(Part2完)
- 数据结构与算法学习笔记04(约瑟夫问题)
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- [翻译]C#数据结构与算法 – 第二章(Part1)