为了账号安全,请及时绑定邮箱和手机立即绑定

优化组合算法的复杂度

优化组合算法的复杂度

慕哥9229398 2023-10-11 22:46:03
我正在努力优化我的代码以解决以下问题:给你 N 个盒子,索引从 1 到 N。每个盒子要么没有硬币,要么包含一枚硬币。空盒子的数量和装有一枚硬币的盒子的数量分别用n0和n1表示。您随机抽取盒子的子集,其中每个子集都有相同的被选择概率。空集和集合本身被视为子集。给定 n0 和 n1,随机子集中硬币总数为偶数的概率是多少?约束:N = n0 + n1 < 100000例子1输入:n0 = 1,n1 = 0输出:1.0解释:有两个子集:[]和[0]。两人的总和相等。2输入:n0 = 0,n1 = 2输出:0.5解释:有四个子集:[]、[1]、[1] 和 [1, 1]。[] 与 [1,1] 之和为偶数。到目前为止,我尝试在 Python 3.8 中实现,但我认为它工作正常,但计算更大的数字需要很长时间。prob = 0n0 = 1n1 = 4for j in range(0, n1+1):        if (j % 2 == 0):            prob += comb(n1, j)total_prob = (2**n0 * prob) / (2 ** (n0+n1))total_prob
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

假设您的算法是正确的,则可以按如下方式分析确定total_prob。


这个总结:


prob = 0

for j in range(0, n1+1):

        if (j % 2 == 0):

            prob += comb(n1, j)

正在计算二项式系数的偶数项,即:


comb(n1, 0) + comb(n1, 2) + ... + comb(n1, J)

    where J is even and J>=n1

J > n1 没问题,因为对于 J > n1,comb(n1, J) = 0(nCr 的定义)


这个总和就是来源:


prob = 2**(n1 - 1)

代入total_prob方程中的prob:


total_prob = (2**n0) *(2**(n1-1)) / (2 ** (n0+n1))

total_prob = 2**(n0 + n1 - 1)/(2**(n0+n1))


total_prob = 0.5  (always)


查看完整回答
反对 回复 2023-10-11
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

import math


def comb(n, k):  # Calculates the combination based on n and k values

    return math.factorial(n) // math.factorial(n - k) //math.factorial(k)


def question(n0, n1):    # probability that the total number of coins in the random subset is even

    """probability of sums of even / total probability"""

    p = 0

    for i in range(0, n1+1):

        if (i % 2 == 0):

            p += comb(n1, i)


    return  p / (2 ** n1)


查看完整回答
反对 回复 2023-10-11
  • 2 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信