Set(集合)是一种常见的、包含不重复元素的数据结构,经常用来判断元素是否存在集合里面或用来判断是否重复。


1. 集合操作

    Set比Dict有更丰富的操作,集合中最常用的操作就是去重、判断是否存在一个元素等。

    假设有A、B两个集合,可以有以下操作:

    交集:A & B

    并集:A  |  B

    差集:A  -  B

    对称差:A ^ B   即:(A|B) - (A&B)


2.frozenset

   这也是一种集合,他的内容是无法变动的,一般常见用法是用一个可迭代的对象初始化他,然后只用来判重等操作;

    如果一开始元素数量固定,一般就会用forzenset,但如果是可变的对象,并且不断添加元素的话,会使用python内置的set。 


3.实现set的抽象数据结构

"""实现之前还是引用之前哈希表那里的HashTable类"""
#-*- coding:utf-8 -*-
class SetADT(HashTable):
    """ 
       继承HashTable类
    """
    def add(self, key):
          """
           调用父类的add的方法,
           简单的把value的值设置成True就可以
           表示有这个元素存在,
           因为hash表是(key,value)的结构,
           所以value设为True就可以。
        """
        return super(SetADT, self).add(key, True)


    def __and__(self, other_set):	              #交集
        new_set = SetADT()		      #定义一个新的集合
        for element_a in self:		      #遍历当前集合的元素,元素为element_a
            if element_a in other_set:	      #如果element_a也是在另外一个集合里面
                new_set.add(element_a)	      #将element_a添加到新集合里面
        return new_set			      #最后返回这个新集合


    def __sub__(self, other_set):	      #差集
        new_set = SetADT()		
	    for element_a in self:
            if element_a not in other_set:
                new_set.add(element_a)
        return new_set
        

    def __or__(self, other_set):	      #并集
         """
           因为之前引用了Hash表的类,
           所以有重复的元素出现时,
           Hash表会保证不会重复添加的,
           因为相同的重复元素都是同样的key值。
        """
        new_set = SetADT()
        for element_a in self:
            new_set.add(element_a)
        for element_b in other_set:
            new_set.add(element_b)
        return new_set



#单元测试
def test_set_adt():
    sa = SetADT()
    sa.add(1)
    sa.add(2)
    sa.add(3)
    assert 1 in sa

    sb = SetADT()
    sb.add(3)
    sb.add(4)
    sb.add(5)
    assert sorted(list(sa & sb)) == [3]
    assert sorted(list(sa | sb)) == [1,2,3,4,5] 
    assert sorted(list(sa - sb)) == [1,2]


___________________分割线________________________________

(未完成部分)

a . 集合判断一个元素是否存在的时间复杂度是O(1)    

    参考资料:https://blog.youkuaiyun.com/baoli1008/article/details/48059623

b . 在SetADT基础上实现remove和pop操作。

    pass

c. 实现对称差(A ^ B)的操作。

    pass

d. 用文档查询工具查看python关于set的文档。