排列组合面试

Posted

技术标签:

【中文标题】排列组合面试【英文标题】:permutation & combinations interview 【发布时间】:2010-10-01 15:14:26 【问题描述】:

这是一个很好的方法,因为它非常违反直觉:

想象一个装满球的瓮,其中三分之二是一种颜色,三分之一是另一种颜色。一个人从瓮中抽出 5 个球,发现其中 4 个是红色的,1 个是白色的。另一个人抽了20个球,发现12个是红色的,8个是白色的。两个人中的哪一个应该更确信骨灰盒中有三分之二的红球和三分之一的白球,而不是相反?每个人应该给出什么赔率?

我知道正确的答案,但我可能不太了解赔率计算。谁能解释一下?

【问题讨论】:

请重新打开。 严格来说它与编程无关,但绝对至少是切线相关的。 另外,请说明我们是否可以假设瓮中的球数量与抽出的数量相比非常大,如果不能,则说明瓮中有多少球。 dsimcha,我的问题副本中没有指定骨灰盒中的球数 让我声明,我发现这是一个特别糟糕的面试问题。这些概念确实很容易掌握,但所涉及的计算有点太长太乏味,无法在面试中进行。 @Daniel:如果繁琐但简单的贝叶斯计算是最简单的,那将是正确的。但很可能人们永远不知道,也许有一个聪明的观察可以让我们避免计算并使问题变得微不足道。 【参考方案1】:

呵呵。可能我完全错了,但答案应该是第二个人不是很直观吗?

一个人看到一个比例:4:1 4/5 : 1/5

二看比例 3:1 3/4 : 1/4

这么简单的问题是谁更接近 2/3 : 1/3 ?因此答案是 Obs。两个。

可能是我犯了两个错误,并且对复杂的事情得到了简单的答案,但请原谅我耐心地对我认为实际上很直观的内容进行冗长的解释。

【讨论】:

【参考方案2】:

我假设一个假设相对于另一个假设的“先验”概率是 1/2,而且两个人在取出每个球后都会重新插入(取出彼此独立)。

正确的答案是第二个观察者应该比第一个更有信心。由于计算中的一个小错误,我之前的答案是错误的,非常感谢 Adam Rosenfield 的更正并 +1。

2/3R 1/3W表示事件“瓮中有2/3的红球和1/3的白球”,令4R,1W表示事件“提取了 4 个红球和 1 个白球”。然后,使用贝叶斯规则,

P[2/3R 1/3W | 4R,1W] = P[4R,1W | 2/3R 1/3W] P[2/3R 1/3W] / P[4R,1W] = (2/3)4 (1/3)1 (1/2) / P[4R, 1W]

现在,由于 2/3R 1/3W1/3R 2/3W 在假设上是互补的,

P[4R,1W] = P[4R,1W | 2/3R 1/3W] P[2/3R 1/3W] + P[4R,1W | 1/3R 2/3W] P[1/3R 2/3W] = (2/3)4 (1/3)1 (1/2) + (1/3)4 (2/3) )1 (1/2)

因此,

P[2/3R 1/3W | 4R,1W] = (2/3)4 (1/3)1 (1/2) / (2/3)4 (1/ 3)1 (1/2) + (1/3)4 (2/3)1 (1/2) = 2^4 / (2^4 + 2) = 8/9

同样计算 P[2/3R 1/3W | 12R,8W](即具有 (2/3)12 (1/3)8 而不是 (2/3) 4 (1/3)1) 现在产生 16/17,因此第二个观察者的置信度大于第一个观察者的置信度。

【讨论】:

re:重新插入 -- 如果球的数量很大,则不需要(可能同样有效的假设) 不应该 P[4R, 1W | 2/3R 1/3W] = (2/3)^4 * (1/3)^1 * (5选4)?另外,我不确定您是如何得出 50% 的先验分布 @FryGuy 50%(或任何其他已知数字!)先验是做出决定的必要先决条件......如果我先验地告诉你“100% 肯定有 2/3红球”那么问题很简单,两个人都可以同样自信......我认为这里缺少太多数据 检查你的算术 - 你的推理是正确的,但如果你插入你的数字,你应该得到第一个观察者的 8/9 和第二个观察者的 16/17。 @Adam Rosenfield:啊啊啊!有一个 2^1 神奇地变成了 1。在一分钟内更正。非常感谢!【参考方案3】:

Eliezer Yudkowsky 有一个(真的,真的很长,但很好)explanation of Bayes' Theorem。大约下降了 70%,有一段以“在你面前是一个书包”开头,说明了这个问题的核心。

关键是,重要的是有多少红球和白球之间的差异。因此,与其他人所说的相反,您不必进行任何计算。 (这是做出合理的假设之一:(a)球被抽出替换,或者(b)骨灰盒中有很多球。那么球无关紧要。)这是论点:

回忆贝叶斯定理:P(A|B) = P(B|A) * P(A) / P(B)。 (关于术语的注释:P(A) 是 prior 而 P(A|B) 是 posterior。B 是您所做的一些观察,术语反映了您的beforeafter 你的观察。)这种形式的定理很好,@bobince 和 @Adam Rosenfield 正确地应用了它。但是,直接使用这种形式会使您容易受到算术错误的影响,并且它并不能真正传达贝叶斯定理的核心。亚当在他的帖子中提到(我在上面提到过),重要的是绘制了多少个红球和白球之间的差异,因为“其他一切都在方程式中抵消了”。不做任何计算我们怎么能看到呢?

我们可以使用优势比似然比的概念。什么是优势比?好吧,我们不会考虑 P(A) 和 P(¬A),而是考虑它们的比率 P(A) : P(¬A)。任何一个都可以从另一个中恢复,但是算法在优势比上效果更好,因为我们不必进行标准化。此外,更容易“得到”贝叶斯定理的另一种形式。

我的意思是我们不必规范化,另一种形式是什么?好吧,让我们计算一下。贝叶斯定理说后验概率是

P(A|B) : P(¬A|B) = (P(B|A) * P(A) / P(B)) : (P(B|¬A) * P(¬A ) / P(B))。

P(B) 是使概率总和为 1 的归一化因子;但是,我们正在使用比率,其中 2 : 1 和 4 : 2 的几率是相同的,所以 P(B) 取消了。我们只剩下一个简单的表达式,它恰好是因数:

P(A|B) : P(¬A|B) = (P(B|A) * P(A)) : (P(B|¬A) * P(¬A)) = (P (B|A) : P(B|¬A)) * (P(A) : P(¬A))

我们已经听说过那里的第二个任期;这是先验优势比。什么是 P(B|A) : P(B|¬A)?这称为似然比。所以我们的最终表达式是

后验概率 = 似然比 * 先验概率。

我们如何在这种情况下应用它?好吧,假设我们有一些先验概率 x : y 表示瓮中的东西,其中 x 代表 2/3 红色,y 代表 2/3 白色。假设我们画了一个单个红球。似然比是 P(drew red ball | urn is 2/3rds red) : P(drew red ball | urn is 2/3rds white) = (2/3) : (1/3) = 2 : 1. 所以后验赔率是 2x : y;如果我们画了一个白球,通过类似的推理,后验概率将是 x : 2y。现在我们对每个球按顺序执行此操作;如果平局是独立的,那么我们只需将所有优势比相乘。因此,如果我们以 x : y 的优势比开始并绘制 r 个红球和 w 个白球,我们得到的最终优势比为

(x : y) * (2 : 1)^r * (1 : 2)^w = (x * 2^r) : (y * 2^w) = (x : y) * (2^ (rw) : 1).

所以我们看到重要的是r和w之间的区别。它也让我们轻松解决问题。对于第一个问题(“谁应该更有信心?”),先验几率无关紧要,只要它们不是 1 : 0 或 0 : 1 并且两个人都有相同的先验。确实,如果他们相同的先验是 x : y,那么第一个人的后验是 (2^3 * x) : y,而第二个人的后验是 (2^4 * x) : y,所以第二个人更当然。

此外假设先验概率是一致的,即 1:1。那么第一个人的后验概率是 8:1,而第二个人的概率是 16:1。我们可以很容易地将这些概率转换为 8/9和 16/17,确认其他计算。

这里的重点是,如果你得到上面的粗体方程,那么这个问题真的很容易。但是同样重要的是,你可以确定你没有搞砸任何算术,因为你必须做的很少。

所以这是一个糟糕的编程问题,但它对粗体方程的一个很好的测试。只是为了练习,让我们将其应用于另外两个问题:

我随机选择两个硬币中的一个,一个公平的硬币或一个假的双头硬币,每个都有 50% 的概率。我把它翻了三遍,三遍都是正面。它是真币的概率是多少?

如问题中所述,先前的赔率是真实的:fake = 1 : 1。我看到真币三个正面的概率是 1 / 8,但假币是 1,所以似然比是 1:8。所以后验概率是 = 先验 * 似然 = 1:8。因此它是真币的概率是 1 / 9。

这个问题也带来了一个重要的警告:每个可能的观察都有一个可能不同的似然比。这是因为 B 的似然比是 P(B|A) : P(B|¬A),这不一定与 ¬B 的似然比有关,即 P(¬B|A) : P(¬ B|¬A)。不幸的是,在上面的所有示例中,它们都是彼此相反的,但在这里,它们不是。

确实,假设我掷硬币一次,得到反面。它是真币的概率是多少?显然是一个。贝叶斯定理如何检验?嗯,这个观察的似然比 是用真币和假币看到这个结果的概率,即 1/2 : 0 = 1 : 0。也就是说,看到一个 单尾消除了硬币是假的可能性,这符合我们的直觉。

这是我在 Eliezer 页面中提到的问题:

你面前是一个书包,里面装着 1000 个扑克筹码。我从两个这样的书包开始,一个包含 700 个红色和 300 个蓝色筹码,另一个包含 300 个红色和 700 个蓝色筹码。我掷了一个公平的硬币来决定使用哪个书包,所以你面前的书包是红色书包的先验概率是 50%。现在,您随机抽样,在每个芯片后更换。在 12 个样本中,您得到 8 个红色和 4 个蓝色。这是主要是红色的袋子的概率是多少? (您不需要精确 - 粗略的估计就足够了。)

先验几率是红色:蓝色 = 1:1。似然比是 7:3 和 3:7,因此后验几率是 (7:3)^8 * (3:7)^4 = 7^ 4:3^4。此时我们只是将 7 : 3 估计为 2 : 1,得到 2^4 : 1 = 16 : 1。我们最终的答案更大,所以肯定大于 95% 左右;正确答案约为 96.7%。将此与大多数人的答案进行比较,后者在 70--80% 范围内。

我希望你同意,从这个角度来看,问题变得非常容易,并且直观

【讨论】:

附言。我认为对于“谁应该更有信心”的部分,如果你用替换来绘图实际上并不重要。当然,这对概率计算很重要。【参考方案4】:

A 是 2/3 的球是红色的事件,然后 ¬A 是 2/3 的球是白色的事件。令 B 为第一个观察者在 5 个中看到 4 个红球的事件,让 C 为第二个观察者在 20 个中看到 12 个红球的事件。

应用一些简单的组合,我们得到了

P(B|A) = (5选4)(2/3)4(1/3) 1 = 80/243 P(BA) = (5选4)(1/3)4(2/3)1 = 10/243

因此,根据贝叶斯定律,观察者 1 的置信度为 80/(80+10) = 8/9,即 A 为真。

对于第二个观察者:

P(C|A) = (20 选择 12)(2/3)12(1/3) 8 = 125970 * 212/320 P(CA) = (20 选择 12)(1/3)12(2/3)8 = 125970 * 28/320

再次根据贝叶斯定律,观察者 2 的置信水平为 212/(212 + 28) = 16 /17 A 是真的。

因此,观察者二具有较高的置信度,即 2/3 的球是红色的。关键是要了解贝叶斯定律是如何工作的。事实上,重要的是观察到的红球和白球数量的差异。其他所有内容(特别是抽出的球总数)都在方程式中抵消了。

【讨论】:

亚当,如果你还没有看到这个计算完成的几率和似然比,看看我的帖子。我希望你喜欢它。【参考方案5】:

P[2/3R 1/3W | 4R, 1W] = (2/3)^4 * (1/3)^1 * (1/2) / (2/3)^4 * (1/3)^1 * (1/2) + (1/3)^4 * (2/3)^1 * (1/2) = 2^4 / (2^4 + 1) = 16/17

呃,

= ⅔^4*⅓ / (⅔^4*⅓ + ⅓^4*⅔)
= 16/243 / (16/243 + 2/243)
= 16/18

P(⅔R⅓W | 12R8W) 确实 = 16/17,所以 12R8W 可以更有信心。

【讨论】:

如果是这样的话,那么这个问题是如何反直觉的呢?更多抽样 = 更有信心,尤其是当您的样本符合您的预期时 顺便说一句,我的评论更多是针对主题创建者所说的“这是一个很好的,因为它非常违反直觉:”。 我看不出任何人应该如何从问题的陈述中“直觉”anything。一个拿了更多的球,另一个有更高的红色百分比,所以他们都有支持更有信心的论据。你必须计算并找到结果,你什么都猜不到。 是的,我不知道,除非我的杜松子酒摄入导致另一个偷偷摸摸的算术错误。我猜想 12R8W 的可能性更大,尽管我完全不确定…… @Daneil Daranas:您在“3*10^11 的质数因子”问题上的 cmets 非常有趣。不幸的是,这个问题需要 no 计算,如果您了解理论,则很容易。你是对的,这是一个糟糕的编程问题,但它不是“太长太乏味”,你可以凭直觉知道答案。

以上是关于排列组合面试的主要内容,如果未能解决你的问题,请参考以下文章

算法面试题 08.07. 无重复字符串的排列组合(多语言实现)

算法面试题 08.07. 无重复字符串的排列组合(多语言实现)

面试题 08.08. 有重复字符串的排列组合

面试题 08.08. 有重复字符串的排列组合

排列组合之组合问题 网易深度学习工程师面试题 C++ 使用10方法

一文搞懂全排列组合子集问题(建议收藏)