【问题标题】:Finding the probability that two items are compared. (hints please)找出比较两个项目的概率。 (请提示)
【发布时间】:2016-04-20 18:51:29
【问题描述】:

我正在尝试解决以下问题(来自 Jeff Erikson 教授的笔记):给定下面的算法,它接受一个未排序的数组 A 并返回数组中的第 k 个最小元素(假设 Partition 做了它的名称暗示通过给定由 Random 返回的枢轴(假定在线性时间内返回 1 和 n 之间的均匀随机整数)并返回枢轴的新索引)的标准快速排序方法,我们将找到 exact 该算法比较输入数组中第 i 个最小元素和第 j 个最小元素的概率。

QuickSelect(A[1..n],k):
  r <-- Partition(A[1..n],Random(n))

  if k < r:
    return QuickSelect(A[1..r-1],k)
  else if k > r:
    return QuickSelect(A[r+1..n],k-r)
  else:
    return A[k]

现在,我可以看到第一个 if 语句为真的概率为 (n-k)/n,第二个块为真的概率为 (k-1)/n,执行 else 语句的概率是 1/n。我也知道(假设 i

任何提示和/或建议将不胜感激。这的家庭作业,所以我宁愿没有完整的解决方案给我,这样我就可以真正学到一点。提前致谢!

【问题讨论】:

  • 这是通过模拟找到近似答案的问题之一。
  • @DavidEisenstat 这是否暗示我实际上实现了该算法并使用各种输入运行它几次,它会让我了解该函数应该是什么?
  • 是的,就是这样。

标签: arrays algorithm probability analysis


【解决方案1】:
  1. 正如已经提到的,Monte Carlo method 是快速(在实现意义上)近似的简单解决方案。

  2. 有一种方法可以使用动态规划计算精确概率

这里我们假设数组中的所有元素都是不同的并且A[i] &lt; A[j]

让我们用P(i, j, k, n) 表示在选择 n 元素数组中的第 k 个元素时比较第 i 个和第 j 个元素的概率。

那么r1..n 中的任何一个的概率相等,这个概率是1/n。另请注意,所有这些事件都是不相交的,它们的联合构成了所有事件空间。

让我们仔细看看r 的每个可能值。

如果r = 1..i-1ij 属于同一部分,如果k &gt; r0 否则它们的比较概率为P(i-r, j-r, k-r, n-r)

如果r = i,概率为1

如果r = i+1..j-1,概率为0

如果r = j,概率为1,如果r = j+1..n,概率为P(i, j, k, r-1),如果k &lt; r,否则0

所以完整的循环公式是P(i, j, k, n) = 1/n * (2 + Sum for r = 1..min(r, i)-1 P(i-r, j-r, k-r, n-r) + sum for r = max(j, k)+1..n P(i, j, k, r-1))

最后对于n = 2(因为ij不同)唯一可能的PsP(1, 2, 1, 2)P(1, 2, 2, 2)并且两者都相等1(不管r是相等的会有一个比较)

时间复杂度为O(n^5)空间复杂度为O(n^4)。还可以优化计算并使时间复杂度O(n^4)。此外,我们只考虑A[i] &lt; A[j]i,j,k &lt;= n 乘法常数为 1/8。因此,可以在几分钟内计算出n 的任何值,最高可达 100,使用所描述的直接算法或最高 300 的优化算法。

【讨论】:

  • 似乎我们能从这个解决方案中得到的最好的结果是重复出现,如果没有特定的值,我们就无法明确解决,因为这个问题特别要求 exact 解决方案,你认为它是在要求递归关系吗?
  • 很大程度上取决于上下文。如果是数学问题,那么他们可能希望您找到明确的公式。如果更多的是关于编程,那么这个算法允许找到该概率的精确值。
  • 这是一个计算机科学问题,所以我假设重复一次就足够了。我总是可以把它扔给 Mathematica 看看它是否能找到解决递归的方法。
  • 顺便说一句,你的剧透中没有任何东西是我在试图解决这个问题的过程中记下的,所以你可以随时拿起剧透。跨度>
  • 再看问题陈述,它告诉我“正确答案是 i、j 和 k 的简单函数”......这让我相信这种重复是假设的有待解决,但我看不到一个简单的方法 - 甚至将其分解为子案例。
【解决方案2】:

请注意,只有当其中一个位置是枢轴时才会比较两个位置。因此,查看这一点的最佳方法是查看所选枢轴的顺序。

假设第 k 个最小的元素在 i 和 j 之间。那么 i 和 j 不被比较当且仅当它们之间的一个元素在 i 或 j 之前被选为枢轴。这种情况发生的概率是多少?

现在假设第 k 个最小的元素在 j 之后。当且仅当 i+1 和 k(不包括 j)之间的元素在 i 或 j 之前被选择为枢轴时,不比较 i 和 j。这种情况发生的概率是多少?

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多