小R的并集大小期望计算 | 豆包MarsCode AI刷题

73 阅读3分钟

小R的并集大小期望计算(小R的并集大小期望计算 - MarsCode)

问题描述

小R有 n 个集合,她想通过随机选择两个集合,并计算它们的并集,来求出这个并集大小的期望值。每个集合中的元素都是唯一的且互不相同。她需要计算出随机选择两个集合并集大小的期望值,并且要求结果保留两位小数。

保证输入至少有两个集合。


测试样例

样例1:

输入:n = 2,st = [[1, 2], [1, 3, 5]]
输出:'4.00'

样例2:

输入:n = 3,st = [[1, 4], [2, 5], [3, 6, 7]]
输出:'4.67'

样例3:

输入:n = 2,st = [[10, 20, 30], [10, 30, 50, 70]]
输出:'5.00'

要计算两个随机选择的集合的并集大小的期望值,我们可以采用以下步骤:

  1. 计算所有集合对的并集大小:对于每对集合,计算其并集的大小。
  2. 计算期望值:将所有这些并集大小加起来,然后除以所有可能的集合对数量。

对于 nn 个集合,随机选择两个集合的方法有 Cn2=n(n1)2C_n^2=\frac{n(n-1)}{2} 种。

算法步骤

步骤 1: 输入处理

  • 我们有两个输入参数:n(集合的数量)和 st(包含所有集合的列表)。
  • 尽管 n 在这个算法中并未直接用于计算(因为我们可以通过 st 的长度来获取集合的数量),但它作为输入的一部分,确保了我们对输入有一定的了解。

步骤 2: 生成集合对

  • 使用 itertools.combinations(st, 2),我们可以生成一个迭代器,该迭代器包含从 st 中选择两个不同集合的所有可能组合。
  • 例如,如果 st = [[1, 2], [3, 4], [5, 6]],那么生成的集合对将是 ([[1, 2], [3, 4]], [[1, 2], [5, 6]], [[3, 4], [5, 6]])

步骤 3: 计算并集大小

  • 对于步骤 2 中生成的每个集合对 (a, b),我们需要计算它们的并集大小。
  • 并集是指两个集合中所有不重复的元素组成的集合。在 Python 中,我们可以使用 set(a).union(set(b)) 来计算两个列表(或集合)a 和 b 的并集。
  • 然后,我们使用 len() 函数来计算并集中元素的数量,并将这个数量添加到 union_sizes 列表中。

步骤 4: 计算期望值

  • 期望值(或平均值)是所有可能结果的算术平均数。
  • 在这里,所有可能的结果就是 union_sizes 列表中的所有元素(即每个集合对的并集大小)。
  • 我们将 union_sizes 列表中所有元素的总和除以列表的长度(即集合对的数量)来计算期望值。

步骤 5: 格式化输出

  • 最后,我们需要将期望值格式化为一个保留两位小数的字符串,以满足题目的要求。
  • 使用 format(expected_union_size, '.2f') 可以实现这一点,其中 '.2f' 指定了格式化为带有两位小数的浮点数。

下面是根据上述步骤实现的代码:

def solution(n: int, st: list) -> str:
    from itertools import combinations
    
    # 计算所有集合对的并集大小
    union_sizes = []
    for a, b in combinations(st, 2):
        union_size = len(set(a).union(set(b)))
        union_sizes.append(union_size)
    
    # 计算期望值
    expected_union_size = sum(union_sizes) / len(union_sizes)
    
    # 保留两位小数并转换为字符串
    return format(expected_union_size, '.2f')

if __name__ == '__main__':
    print(solution(2, [[1, 2], [1, 3, 5]]) == '4.00')
    print(solution(3, [[1, 4], [2, 5], [3, 6, 7]]) == '4.67')
    print(solution(2, [[10, 20, 30], [10, 30, 50, 70]]) == '5.00')

解释:

  1. 导入 itertools.combinations:用于生成所有可能的集合对。
  2. 计算并集大小:对于每对集合,使用 set(a).union(set(b)) 计算并集,并计算其长度。
  3. 计算期望值:将所有并集大小的总和除以并集大小的个数。
  4. 格式化输出:使用 format(expected_union_size, '.2f') 保留两位小数并转换为字符串。

这段代码将正确计算并输出随机选择两个集合并集大小的期望值,结果保留两位小数。 s

#青训营笔记创作活动