期望自学
最近觉得期望特别玄学,特地放个博客慢慢整理
仅仅是给自己看,所以文中可能有很多概念性的(+就是错了)的错误,如果有大佬看见还望指出。。。
期望的实际意义
实验重复无数次的平均权值,随着发生次数的上升,最终平均值会无线接近一个数,期望
我的理解
加权平均数。。。
由于这个性质,期望具有线性性,也就是 和的期望 = 期望的和
还有 \(E(kx) = k E(x)\)
这里的 \(x_i\) 是互不影响的事件
注意, \(E(x_1 x_2) != E(x_1)E(x_2)\)
放到式子里就很好理解
比原来多出来一沓
有一些题目算要求期望,概率很不好算,但是却可以用期望+走一步的概率倒着推出来,这个地方我觉着玄学的一批,很有道理又很没道理,放到以后解决吧
要说期望还顶有概率,关于概率,除了有不连续的还有连续的
关于连续有几个积分式子和定义
一些定义
\(P(x),\ ans = x\) 的概率
\(p(x) = f'(x),\ p(x)\) 叫连续性随机变量的概率密度函数(\(p(x)\) 越大说明随机变量是 \(x\) 的概率相对较大)
\(f(x),\ ans <= x\) 的概率,叫连续形随机变量的概率分布函数
- \(tps:\) 如果您要阅读请直接看下面的全概率公式(严谨证明)
\(thinking\)
如果我要求连续性随机变量落在 \([l, r]\) 的概率,\(P(l:r) = f(r) - f(l)\)
有一个式子
假如随机变量的范围是区间 \([l, r]\) 落在 \(x\) 的权值就是 \(x\),这就更有意思了
最后一步转化要怎么证呢 ? 一个想法是求出原函数
tps:后来才知道上面那玩意是全概率公式。。。
还是简述一下(其实就是上面的东西,可跳过)
全概率公式
随机变量 \(x\) 的权值是 \(x\) 且随机落在区间 \([l, r]\),设 $f(x) = $ 答案 \(\ge x\) 的概率, 当 \([x(-f(x))]_l^{r+dx} = 0\) 时有
设 \(P(x)\) 为随机变量恰好为 \(x\) 的概率,\(p(x)\) 是 \(x\) 的概率密度函数
证明1
考虑到积分余项,当 \([x(-f(x))]_l^{r+dx} = 0\) 时 \(E(x) = \int_l^r f(x) dx\)
证明2(有点抽象且不严格,看看就好)
把这个式子一项一项展开
这个对于 \(dx = 1\) 的情况同样适用
证毕
下面放一道题
P3343 [ZJOI2015]地震后的幻想乡
题目大意: 每个边有一个 \([0, 1]\) 的随机权值,求整张图联通的期望时间
设 \(P(t)\) 为联通时间为 \(t\) 的概率,\(p\) 是概率密度函数,\(f\) 是概率分布函数 \(f(t)\) 表示联通时间 \(> t\) 的概率
很显然题目要求
根据全概率公式
问题来了,怎么求呢?
我们将 \(f(x)\) 再加个定义 \(f_s(x)\) 表示几何为 \(s\) (\(s\) 是原图的子集,且 \(1 \in s\)) 的子图联通时间 \(> t\) 的概率
首先 \(f_{\{1\}} = 0\)
这里 \(|T(s_0, s - s_0)|\) 表示 \(s_0\) 与 \(s - s_0\) 联通的边数,\((1 - f_{s_0}(t))\) 是 \(t\) 时刻 \(s_0\) 已经联通的概率
用 \(all\) 表示全集,这样可以把原式子写成
这显然是一个递归形式,它的边界是 \(\int_0^1 f_{\{1\}}(t) dt = 0\)
下面我们来看更一般的形式
然后这道题就做完了
初始情况为
\(code\)
#include <bits/stdc++.h>
using namespace std;
#define rg register
// #ifdef ONLINE_JUDGE
// char ss[1 << 17], *A = ss, *B = ss;
// inline char gc(){ if(A == B){ B = (A = ss) + fread(ss, 1, 1 << 17, stdin); if(A == B) return EOF; } return *A++; }
// #define getchar gc
// #endif
inline int read(){
#define G ch = getchar()
rg char G;
rg int x = 0, f = 0;
while(!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pre(i, a, b) for(int i = a; i >= b; --i)
const int N = 11, M = N * N;
double f[1 << 10][M];
int link[N], sz[1 << 10];
int n, m;
signed main(){
n = read(), m = read();
rep(i, 1, m){
int x = read(), y = read();
link[x - 1] |= 1 << (y - 1);
link[y - 1] |= 1 << (x - 1);
}
int top = 1 << n;
for(int i = 1; i < top; ++i) sz[i] = sz[i & (i - 1)] + 1;
// rep(i, 0, m) f[1][i] = 0;
for(int i = 2; i < top; ++i) if(i & 1){
for(int s = (i - 1) & i; s; s = (s - 1) & i) if(s & 1){
rg int ecnt = 0;
rep(k, 0, n - 1) if((i >> k & 1) & ((~s) >> k & 1)) ecnt += sz[link[k] & s];
rep(j, 0, m - ecnt) f[i][j] += 1. / (j + ecnt + 1) - f[s][j + ecnt];
}
}
printf("%.6lf", f[top - 1][0]);
// cout<<fixed<<setprecision(6)<<f[top - 1][0]<<endl;
getchar(); getchar();
return 0;
}