在学校论坛里看到如下算法题目:
一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?
自己的第一想法是用求数学期望的公式来求解,但看了评论里大神用分叉树递归列方程法很简单的解决了这个问题,顿觉新颖,记录如下。
还是用例子来讲解这种方法。
实例一
问题:
一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?
分析:
这是一个求数学期望的问题,最终是求1,2,3出现至少一次的最短长度的期望。
这样分叉树的每个节点是一个期望状态,而每个分叉是一次投掷结果。将后续期望出现1、2、3各至少一次的情形记作L123
(即题目所求),将后续期望出现1、2各至少一次(3无关)情形记作L12
,而1至少一次(2,3无关)情形L1
,其余数值符号类推,则树结构如下(列出4级结构已经足够):
接下来,就是要排出方程,因为一共7个未知数(L123
,L12
,L23
,L13
...),如果排出7个线性方程就能解决问题。
这方程组里的未知数对应上述的状态,而其数值则是一个对长度(投掷次数)的数学期望。
根据这个树状结构和其中的递归关系,这个方程组就是:
L123 = p1*(L23+ 1) + p2*(L13+1) + p3*(L12 + 1) = p1*L23 + p2*L13 + p3*L12 + 1
(以这个
L123
为例,解释,投掷1的概率是p1
而由此得到的结果是需要期待后续2和3各至少出现一次,于是长度期望是L23+ 1
,加1是因为投掷了一次,亦即即增进一级)
L23 = p1*L23 +p2*L3+ p3*L2 + 1
L13 = p1*L3 +p2*L13+ p3*L1 + 1
L12 = p1*L2 +p2*L1+ p3*L12 + 1
L1 =p2*L1+ p3*L1 + 1
(这里实际上是
L1 =p1*1 + p2*(L1+1) + p3*(L1 +1) =p2*L1+ p3*L1 + 1
,因为对L1
情形,如果投了1就目的达到终止了)
L2 = p1*L2 + p3*L2 + 1
L3 = p1*L3 +p2*L3+ 1
其中p1,p2和p3分别是掷出1,2和3的概率,即1/6,1/3,1/2。
于是求解这个方程,得到:
L1 = 6, L2 = 3, L3 = 2
L12 = 7, L13 = 13/2, L23 = 19/5
L123 = 219/30 = 7.3
平均掷7.3 次可出现这些面值各至少一次。
用分叉树递归列方程法在来求解另一个概率问题,如下:
实例二
问题:
假设有一个硬币,抛出字(背面,记为
T
)和花(正面,记为H
)的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现两次字为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出两个“字”向上游戏就结束了,不用继续抛。
分析:
将LTT
记为后续期望出现连续两个T
的节点,其值即为所求。LT
记为下一次投掷结果期望出现T
的节点。
第一级(树根) | 第二级 | 第三级 |
---|---|---|
LTT | 掷T -> LT | 掷T -> 结束 |
. | . | 掷H -> LTT |
. | 掷H -> LTT | . |
根据树状结构和其中的递归关系列方程如下:
LTT = pT*(LT+1) + pH*(LTT+1)
LT = pT*1 + pH*(LTT+1)
其中pT
和pH
分别是掷出字和花的概率,即为0.5
,0.5
求解上述方程式,可得到:
LTT = 6
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。