37%法则
题目:一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略?
——出自牛客网机器学习/算法工程师面试宝典
官方给出的解答是真的看不懂,没有任何解释,而网上大部分解释都是照搬官方回答或者37%法则的数学推理。
很多人看官方的回答会陷入一个误区,比如这个老哥的评论:
其实官方的解题思路并不是找到最优的那个数字,举个例子:
可以看到这里10是最大的数字,但我们根据这个策略(前3个不选,然后只要见到比8大的就选),选择的数字却是9。
解题思路是这样的:前
r
r
r个女生我是只看不选的,从第r+1个女生开始选。
这种策略并不保证选到最优的结果(10),但是能保证你选到一个还不错的结果,最重要的是,这种策略是可以计算的,可以用数学公式来算。因为你想,这道题给你,你能想到什么策略?只有这一种策略嘛,所以最重要的就是找到这个数,这个
r
r
r是几的时候,概率最大。
接下来就是数学公式了。我们用
P
(
K
)
P(K)
P(K)来表示选到最佳结果的概率,由于
r
r
r是变量,所以这个概率是变化的,我们最后才可以求导取这个概率的最大值。
P
(
K
)
=
∑
i
=
r
+
1
n
1
n
∗
r
i
−
1
P(K)=\sum_{i=r+1}^{n}\frac{1}{n}*\frac{r}{i-1}
P(K)=i=r+1∑nn1∗i−1r
公式的理解:
首先这个求和符号就是高中学的加法原理,把每一个数字选中的概率都算出来加一起就是最后的结果。为了方便解释,我们就用上面的例子,然后令
r
r
r取3,前3个不取,自然就不用加了,直接从4开始,所以我们选择的结果就是从第4个到第8个数字,每个数字被选中的概率是均等的,所以先来个
1
9
\frac{1}{9}
91。
接下来就是核心了,我们用例子中的第六个数字9来说举例,要想选中9,条件就是前5个数字中,最大的数字(8)必须在前三个数字中,否则的话第4个数字来个10,直接就选第4个数字10了,就轮不到9了。这就是为什么要乘
r
i
−
1
\frac{r}{i-1}
i−1r
i
−
1
i-1
i−1意思是前
i
−
1
i-1
i−1个数字,
r
r
r意思就是看了不选的前r个数字,每个数字的概率相等,那
r
r
r个数字中有最大值的概率自然就是
r
r
r除以总数
i
−
1
i-1
i−1。
很多人就是把这里找最大值的过程,当做是找最优结果了。谁让官方回答来了一个《拥有最长玫瑰的女生出现在前r-1个女生中》。这种说法是不准确的,应该说《前k-1个女生中,拥有最长玫瑰的女生出现在前r-1个女生中》,这样大家就不会误解了。
理解如何得到
P
(
K
)
P(K)
P(K)之后,下面就是求个导数。(官方回答仍然很让人费解,我是看不懂)
P
(
K
)
P(K)
P(K)可以这样写
P
(
K
)
=
1
n
∑
i
=
r
+
1
n
r
i
−
1
P(K)=\frac{1}{n}\sum_{i=r+1}^{n}\frac{r}{i-1}
P(K)=n1i=r+1∑ni−1r
就是把
1
n
\frac{1}{n}
n1放到前面去,只有
i
i
i是不能提出来的,其他字母都可以提出来。我们的变量只有一个
r
r
r。
令
x
=
r
n
x=\frac{r}{n}
x=nr
P
(
K
)
P(K)
P(K)就可以写为: (如果这一步不懂,可以先跳过,下面有解释,用到了微积分中的求和公式转积分的知识)
P
(
K
)
=
x
∫
x
1
1
t
d
t
=
−
x
l
n
x
P(K)=x\int_x^1\frac{1}{t}dt=-xlnx
P(K)=x∫x1t1dt=−xlnx
求导,
P
′
(
K
)
=
−
(
l
n
x
+
1
)
P^\prime(K)=-(lnx+1)
P′(K)=−(lnx+1)
令
P
′
(
K
)
=
0
P^\prime(K)=0
P′(K)=0则
x
=
1
e
x=\frac{1}{e}
x=e1
P
(
K
)
m
a
x
=
1
e
P(K)_{max}=\frac{1}{e}
P(K)max=e1
r
=
n
e
r=\frac{n}{e}
r=en
求和公式转积分
如何从
P
(
K
)
=
1
n
∑
i
=
r
+
1
n
r
i
−
1
P(K)=\frac{1}{n}\sum_{i=r+1}^{n}\frac{r}{i-1}
P(K)=n1i=r+1∑ni−1r变到
P
(
K
)
=
x
∫
x
1
1
t
d
t
=
−
x
l
n
x
P(K)=x\int_x^1\frac{1}{t}dt=-xlnx
P(K)=x∫x1t1dt=−xlnx
这里要用到微积分的知识。首先回顾一下积分求和公式:
∫
0
1
f
(
x
)
d
x
=
lim
n
→
+
∞
1
n
∑
i
=
1
n
f
(
i
n
)
\int_0^1f(x)dx=\lim_{n \to +\infty}\frac{1}{n}\sum_{i=1}^nf(\frac{i}{n})
∫01f(x)dx=n→+∞limn1i=1∑nf(ni)
求和公式转成积分,不是特别直观,我们采用的方法是尽量还原成积分求和公式右边的这种形式
我们把
P
(
K
)
P(K)
P(K)公式的下标变换一下:
P
(
K
)
=
1
n
∑
i
=
r
n
r
i
P(K)=\frac{1}{n}\sum_{i=r}^{n}\frac{r}{i}
P(K)=n1i=r∑nir
然后把
r
r
r提出来
P
(
K
)
=
r
n
∑
i
=
r
n
1
i
P(K)=\frac{r}{n}\sum_{i=r}^{n}\frac{1}{i}
P(K)=nri=r∑ni1
接下来就是凑,往标准公式右边凑,已经有
1
n
\frac{1}{n}
n1了,不用凑了,但我们是
1
i
\frac{1}{i}
i1,别人是
i
n
\frac{i}{n}
ni,那可以乘个
n
n
n
再取倒数,就变成了
P
(
K
)
=
r
n
∗
1
n
∑
i
=
r
n
1
i
n
P(K)=\frac{r}{n}*\frac{1}{n}\sum^n_{i=r}\frac{1}{\frac{i}{n}}
P(K)=nr∗n1i=r∑nni1
我们令
x
=
r
n
x=\frac{r}{n}
x=nr
直接把
i
n
\frac{i}{n}
ni换成变量
t
t
t就行了,上限是当
i
i
i取到
n
n
n时,即1,下限是当
i
i
i取
r
r
r时,即
r
n
\frac{r}{n}
nr,也就是
x
x
x
所以
P
(
K
)
=
x
∫
x
1
1
t
d
t
P(K)=x\int_x^1\frac{1}{t}dt
P(K)=x∫x1t1dt