Python程序:求表达式结果中出现频率最高值的期望值


假设我们有M个不同的表达式,这些表达式的结果在1到N(包含1和N)的范围内。考虑x = max(f(i)),其中i从1到N,我们需要找到x的期望值。

例如,如果输入为M = 3,N = 3,则输出为2.2,因为

序列最大频率
1113
1122
1132
1222
1231
1331
2223
2232
2332
3333

$$E(x) = \sum P(x) * x = P(1) + 2P(2) + 3P(3) = \frac{1}{10} + 2 * \frac{6}{10} + 3 * \frac{3}{10} = \frac{22}{10}$$

为了解决这个问题,我们将遵循以下步骤:

  • combination := 一个新的映射
  • 定义一个函数nCr()。它将接收n和k_in作为参数。
  • k := k_in和(n - k_in)中的最小值
  • 如果n < k或k < 0,则
    • 返回0
  • 否则,如果(n, k)存在于combination中,则
    • 返回combination[n, k]
  • 否则,如果k等于0,则
    • 返回1
  • 否则,如果n等于k,则
    • 返回1
  • 否则,
    • a := 1
    • 对于cnt从0到k - 1,执行以下操作:
      • a := a * (n - cnt)
      • a := floor of a/(cnt + 1)
      • combination[n, cnt + 1] := a
    • 返回a
  • 在主方法中,执行以下操作:
  • arr := 一个新的列表
  • 对于k从2到M + 1,执行以下操作:
    • a := 1
    • s := 0
    • 对于i从0到floor of M/k + 2,执行以下操作:
      • 如果M < i * k,则
        • 退出循环
      • s := s + a * nCr(N, i) * nCr(N-1+M-i*k, M-i*k)
      • a := -a
    • 将s插入到arr的末尾
  • total := arr的最后一个元素
  • diff := 一个数组,在开头插入arr[0],然后添加一个列表,其中包含(arr[cnt + 1] - arr[cnt]),其中cnt从0到M - 2
  • output := (diff[cnt] *(cnt + 1) / total,其中cnt从0到M-1)中所有元素的总和
  • 返回output

示例

让我们看看以下实现,以便更好地理解:

combination = {}
def nCr(n, k_in):
   k = min(k_in, n - k_in)
   if n < k or k < 0:
      return 0
   elif (n, k) in combination:
      return combination[(n, k)]
   elif k == 0:
      return 1
   elif n == k:
      return 1
   else:
      a = 1
      for cnt in range(k):
         a *= (n - cnt)
         a //= (cnt + 1)
         combination[(n, cnt + 1)] = a
      return a

def solve(M, N):
   arr = []
   for k in range(2, M + 2):
      a = 1
      s = 0
      for i in range(M // k + 2):
         if (M < i * k):
            break
         s += a * nCr(N, i) * nCr(N - 1 + M - i * k, M - i * k)
         a *= -1
      arr.append(s)
   total = arr[-1]
   diff = [arr[0]] + [arr[cnt + 1] - arr[cnt] for cnt in range(M - 1)]
   output = sum(diff[cnt] * (cnt + 1) / total for cnt in range(M))
   return output

M = 3
N = 3
print(solve(M, N))

输入

3, 3

输出

1

更新于: 2021年10月11日

105 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告