集合是数据结构中基本的结构,它完全和数学中的集合一致,那下面就来看下数学中的集合到底是什么?
集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成集合的这些对象则称为该集合的元素。
举几个例子,如果以人类为一个集合,中国人就是该集合中的一个元素。如果以 0-100
的自然数为一个集合,0
就是该集合中的一个元素,记作 0∈100
,101
不是该集合中的元素,就记作 0∉100
。 更详细的请打开高数(一)第一章仔细看看。
集合有下面三个特性:
确定性: 给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
互异性: 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
无序性: 一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
如果一个集合它不包含任何元素,称之为空集,记作 ∅
。
代码中可表示为一个空数组(为了方便理解,以下所有演示都以 Python
为例讲解)。
In [1]: data = set()
In [2]: data
Out[2]: set()
如果集合 A
的所有元素都属于集合 B
,那么 A
集合就是 B
集合的子集。
In [3]: data = set({1, 2, 3, 4, 5})
In [4]: data
Out[4]: {1, 2, 3, 4, 5}
In [5]: 1 in data
Out[5]: True
In [6]: 0 in data
Out[6]: False
所有属于集合 A
且属于集合 B
的元素组成的集合叫作交集,记作 A∩B
。
In [7]: data = set({1, 2, 3, 4, 5})
In [8]: s = set({2, 4, 6})
In [9]: data & s
Out[9]: {2, 4}
所有属于集合 A
或属于集合 B
的元素组成的集合叫作并集,记作 A∪B
。
In [10]: data | s
Out[10]: {1, 2, 3, 4, 5, 6}
所有属于集合 A
且不属于集合 B
的元素组成的集合叫作集合 A
相对于集合 B
的差集,记作 A-B
。
In [11]: data - s
Out[11]: {1, 3, 5}
In [12]: s - data
Out[12]: {6}
补集一般指绝对补集,如果 A
是 B
的一个子集(子集的概念往上看↑
),B
中所有不属于 A
的元素组成的集合,叫作 A
在 B
中的补集。可以说补集是差集的一个特例。
A
是 B
的子集,B
是 A
的超集。
In [13]: s1 = set({2, 4})
In [14]: data - s1
Out[14]: {1, 3, 5}
集合 A
与集合 B
中所有不属于 A∩B
的元素的集合叫作对称差集,记作 A△B
,即:A△B=(A∪B)-(A∩B)
。
In [13]: data ^ s
Out[13]: {1, 3, 5, 6}
上面的代码都是用 Python
中已经实现好的集合数据结构,接下来就用我们熟悉的语言将这个集合数据结构用算法实现。
这个真的很简单,我这里就不写了(可能以后不忙的时候会写)。注意的有几点,只用数组为基本数据结构来实现,集合的特性和类型都要全部满足,性能和效率暂时不用考虑,等学完字符串匹配算法和排序算法等等再回来优化。