可能错误比较器的排序算法分析?

时间:2015-04-26 09:54:16

标签: algorithm sorting machine-learning probability quicksort

面试中这是一个有趣的问题,我没有成功。

数组有 n 个不同的元素[A1 .. A2 .... An](随机顺序)。

我们有一个比较器C, ,但它有一个概率p来返回正确的结果。

现在我们使用C来实现排序算法(任何种类,气泡,快速等)。

排序后我们有[Ai1,Ai2,...,Ain] (可能是错误的)

现在给出一个数字 m (m

  1. {A1,A2,...,Am}与{Ai1,Ai2,...之间的交点大小 S 的期望是什么换句话说,目标是什么是E [S]

  2. m,n和p 之间的任何关系

  3. 如果我们使用不同的排序算法, E [S]将如何变化

  4. 我的想法如下:

    1. 当m = n时,E [S] = n,肯定
    2. 当m = n-1时,E [S] = n-1 + P(Ain中的An)
    3. 我不知道如何完成答案,但我认为可以通过归纳解决.. 我认为任何模拟方法都可以。

2 个答案:

答案 0 :(得分:1)

嗯,如果A1,A2,...,An是随机顺序(如问题中所述),那么比较器C的所有排序和正确概率并不重要。然后将问题简化为期望两个随机子集的交叉长度,每个子集的大小为m,{A1,...,An}。

S为k的概率为(m k)*((n-m) (n-k))/(n m),其中(a b)表示" a b",b元素从{{ 1}}元素。 (因为对于第二个子集,我们必须从第一个子集中选择a个元素,并从其余子集中选择k元素。)

E [S]则为m-k,后者缩减为sum(0 <= k <= m) k*(m k)*((n-m) (n-k))/(n m)。这个总和是给出m/(n m) * sum(0 <= k <= m) ((m-1) (k-1))*((n-m) (n-k))的基本(众所周知的)二项式身份,所以最后得到((n-1) (m-1)) = m/(n m) * ((n-1) (m-1))

答案 1 :(得分:0)

修改后问题的部分答案:

  • 假设Ai1,...,Aim不与初始(随机)数组开始相交,但是使用正确排序的数组Aj1,...,Ajn的前m个值。 (这似乎更有趣)
  • 让我们进一步假设比较器C是非确定性的。
  • 为简单起见,我们假设所有数组元素都不同且n = 2 ^ N。

现在这里的部分答案首先仅限于

  • m = 1的
  • sorting-algorith = merge sort

Aj1是最小的元素。在合并排序中,每个元素的比较ld(n)= N次。当且仅当它在每个ld(n)= N比较中变小时,最小元素被分类到第一个位置。因此概率P(Ai1 = Aj1)= p ^ N,其等于m = 1所请求的E [S]。所以我们得到

E[S] = p^ld(n)

这是

的部分答案
  • m = 1的
  • 排序算法=冒泡排序,首先获得最小的元素

如果最小元素在开头的位置k(Ak = Aj1),那么需要max(k-1,1)个正确的比较才能将Ak带到前面(Ak = Ai1)。由于所有n个起始位置同样可能,我们得到

E[S] = P(Ai1=Aj1) = 
     = P(Ai1=Aj1|Aj1=A1)*P(Aj1=A1) + ... + P(Ai1=Aj1|Aj1=An)*P(Aj1=An) =
     = 1/n (p + p + p^2 + ... + p^(n-1)) = 1/n ((1-p^(n-1))/(1-p)+p-1) =
     = (2p - p^2 - p^(n-1)) / (n(1-p))

一般情况下祝你好运!