数据蛙数据分析每周作业

最小子集问题

2019-03-31  本文已影响0人  XIN71
# 题目:
# 求在Rn中找出个数最少的一个子集,这个子集的所有元素的并集为U,要求U ∩ C = C,且U ∪ C = U,请写出求解这样的一个子集的通用算法。

R = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']

R1 = ['b', 'b', 'c', 'd', 'e', 'f', 'g']
R2 = ['b', 'c', 'd', 'g', 'k', 'l', 'm', 'n']
R3 = ['a', 'c', 'g', 'i', 'j', 'k', 'm', 'n']
R4 = ['a', 'c', 'd', 'f', 'g', 'i', 'j', 'k', 'm', 'n']
R5 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l',  'n']
Rn = [R1, R2, R3, R4, R5]

C = ['b', 'b', 'd', 'g']

# -------------------------------------------------------------------------------------------------------------------
# 思路:
# 将C的集合与R1、R2…Rn的集合对比遍历对比,找出符合要求且元素数最少的Rn(可能是多个)

C_set = set(C)                                 # 求出C的集合(即去重)
subset = [R]                                   # 满足U∩C = C,且U∪C = U的目标子集初始化为R,命名为subset

for i in Rn:                                   # 遍历Rn
    for j in C_set:                            # 遍历C的集合,如果C集合中的每个元素都在子集中,则下一步,否则剔除
        if j not in set(i):
            break
    else:
        if len(i) < len(subset[0]):            # 若该子集元素个数<subset中子集的元素个数,则清空subset,将该子集设为新的subset
            subset = [[]]
            subset[0] = i
        elif len(i) == len(subset[0]):         # 若该子集元素个数=subset中子集的元素个数,则将此子集添加到subset
            subset.append(i)

print(subset)                                  # 打印出满足条件的子集
上一篇 下一篇

猜你喜欢

热点阅读