十三.集合
集合的定义
集合成员是无序的、并且都是只出现一次。
空集合:是不包含任何成员的集合。
全域:是所有可能成员的集合。
集合的操作
联合:两个集合的并集
交叉:两个集合的交集
差异:存在于第一个集合,但不存在于第二个集合,也就是相对补集,A相对B的补集。
集合的属性(性质)
集合与空集合的交叉是空集合。集合与空集合的联合是集合本身。
集合与自身的交叉是自身,与自身的联合还是联合。
联合、交叉满足交换律、结合律、分配律。
吸收定律:
集合A联合另一集合B再交叉自身集合A,结果还是集合A。
德摩根定律:
集合A差异(集合B交叉集合C)等于(集合A差异集合B)联合(集合A差异集合B)。
集合A差异(集合B联合集合C)等于(集合A差异集合B) 交叉 (集合A差异集合B)。
用散列表实现一个Set集合类
用散列表可以存储任何类型的数据项。
内部实现
HashSet类:
public class HashCSet
{
private Hashtabledata;
public HashCSet()
{data = new Hashtable();}
///<summary>
///添加一个数据项。Hashtable的值为item,键为item根据内部散列函数计算的散列值。
///</summary>
///<param name="item"></param>
public void Add(Object item)
{
if (!data.ContainsValue(item))
{ data.Add(item, item); }
}
///<summary>
///散列函数,数据项字符的ASCII码值来计算散列值
///</summary>
///<param name="item"></param>
///<returns></returns>
private string Hash(object item)
{
char[]chars;
string s = item.ToString();
int hashvalue = 0;
chars = s.ToCharArray();
for (inti = 0; i <=chars.GetUpperBound(0); i++)
{
hashvalue += (int)chars[i];
}
return hashvalue.ToString();
}
public void Remove(object item)
{
data.Remove(Hash(item));
}
public int Size
{
get { returndata.Count; }
}
///<summary>
///联合
///</summary>
///<param name="aSet"></param>
///<returns></returns>
public HashCSetUnion(HashCSet aSet)
{
HashCSet tempSet = new HashCSet();
foreach (ObjecthashObjectin data.Keys)
tempSet.Add(this.data[hashObject]);
foreach (ObjecthashObjectin aSet.data.Keys)
if (!(this.data.ContainsKey(hashObject)))
tempSet.Add(aSet.data[hashObject]);
return tempSet;
}
///<summary>
///返回一个和指定集合交叉的集合
///</summary>
///<param name="aSet"></param>
///<returns></returns>
public HashCSetIntersection(HashCSet aSet)
{
HashCSet tempSet = new HashCSet();
foreach (ObjecthashObjectin data.Keys)
{
if (aSet.data.Contains(hashObject))
tempSet.Add(aSet.data[hashObject]);
}
return tempSet;
}