问题1:给定离散随机变量 x 均匀分布在区间 [a, b] 的整点上,y 均匀分布在区间 [c, d] 的整点上,求期望 E(|x-y|)。
问题很简单,显然最直接的办法就是枚举 x 和 y 然后进行统计即可。如果再稍稍思考一下,那么可以发现其实只用枚举其中一个变量就行了,因为若固定 x = i,那么求 E(|i-y|) 只需要对 i <=y 和 i > y 两种情况分别进行讨论即可。上面两个方法的运行时间都是与区间的大小相关的,对于这样简单的一个问题,有理由相信一定有 O(1) 的方法存在,事实上也的确如此,推导如下。
首先可以交换 x , y 的顺序以保证 a <= c,那么 a, b, c, d 之间的顺序可以分成 3 种情况:
- a <= b <= c <= d
- a <= c < b <= d
- a <= c <= d < b
对于第 1 种情况,因为 y 始终大于等于 x,因此 E(|x-y|) = E(y) – E(x);
对于第 2 种情况,除了 cb 段以外 y 始终大于 x, 因此 E(|x-y|) = E(y) – E(x) + p_cb_cb * e_cb_cb,这里的p_cb_cb 表示 x 和 y 都分布在 cb 段的概率,e_cb_cb 表示当 x 和 y 都分布在 cb 段时,|x-y|的期望。
对于第 3 种情况,可以将第 ab 拆成 ad 和 d’b 两段,这里 d’ = d + 1。于是 E(|x-y|) = p_ad_cd * e_ad_cd + p_d’b_cd * e_d’b_cd,而 e_ad_cd 可以按第 2 种情况来求, e_d’b_cd 可以按第 1 种情况来求,问题解决。
现在唯一剩下的问题就是如果求 e_cb_cb,显然若 b – c + 1 = n,那么 e_cb_cb = e_[1, n]_[1, n]. 于是问题可以转换为:
问题2:给定离散随机变量 x 和 y 均匀分布在区间 [1, n] 的整点上,求期望 E(|x-y|)。
问题 2 简单地做一个求和就可以得到一个 closed form:
利用上式可以得到解决问题 1 的代码如下: