找出比较两个项目的概率。 (提示)

时间:2016-04-20 18:51:30

标签: arrays algorithm probability analysis

我正在尝试解决以下问题(来自Jeff Erikson教授的注释):给定下面的算法,它接收一个未排序的数组A并返回数组中的第k个最小元素(假设分区做了它的name暗示通过标准的quicksort方法给定Random返回的pivot(假设在线性时间内返回1和n之间的均匀随机整数)并返回pivot的新索引),我们要找到 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语句为真的概率是(nk)/ n,第二个块为真的概率是(k-1)/ n,以及执行else语句的概率是1 / n。我也知道(假设i&lt; j)i&lt; j的概率。 r&lt; j是(j-i-1)/ n,它保证永远不会比较这两个元素。另一方面,如果i == r或j == r,则保证i和j被比较。真正让我失望的部分是如果r&lt;我或j&lt; r,因为是否比较i和j取决于k的值(无论我们是否能够递归调用QuickSelect)。

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

2 个答案:

答案 0 :(得分:0)

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

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

  3. 这里我们假设数组中的所有元素都是不同的A[i] < A[j]

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

    然后r1..n中的任何一个相同,概率为1/n。还要注意,所有这些事件都是非交叉的,它们的联合构成了事件的所有空间。

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

    如果r = 1..i-1,那么ij属于同一部分,如果P(i-r, j-r, k-r, n-r)k > r,他们的比较概率为0否则。

    如果r = i概率为1

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

    如果r = j的概率为1r = j+1..n的概率为P(i, j, k, r-1) k < r0则为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

    最后,对于ijPs不同),唯一可能P(1, 2, 1, 2)P(1, 2, 2, 2)1且两者相等r(无论O(n^5)等于什么,都会有比较)

    时间复杂度为O(n^4) 空间复杂度为O(n^4) 。此外,还可以优化计算并使时间复杂度A[i] < A[j]。另外,我们只考虑i,j,k <= nn乘法常数是1/8。因此,可以使用所描述的直接算法在几分钟内计算<div class="row"> <div class="col-md-6"> <div class="container-fluid"> <div style="height: 400px; overflow-y: scroll"> <div class="list-group" name="companies" id="company"> <!--Call the Showcompany() method from the select.class.php--> <?php echo $opt->ShowCompany(); ?> </div> </div><!--End of first input group--> </div><!--End of container--> </div><!--End of column--> <div class="col-md-6"> <div class="container-fluid"> <div style="height: 400px; overflow-y: scroll"> <div class="list-group" multiple onchange="changeSelection(this.value)" name="sites" id="sites"> <?php echo $opt->ShowSite(); ?> </div> </div><!--End of first input group--> </div><!--End of container--> </div><!--End of column--> </div> 最多100的任何值,或者对于优化的算法计算最多300的任何值。

答案 1 :(得分:0)

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

假设第k个最小元素在i和j之间。然后i和j不进行比较,当且仅当在i或j之前选择它们之间的元素作为枢轴时。发生这种情况的概率是多少?

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