我正在尝试解决以下问题(来自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)。
任何提示和/或建议都将不胜感激。这个是用于家庭作业,所以我宁愿没有给我完整的解决方案,所以我可能真的学到了一点。提前谢谢!
答案 0 :(得分:0)
正如已经提到的那样Monte Carlo method是快速(在实现意义上)近似的简单解决方案。
有一种方法可以使用动态编程计算精确概率
这里我们假设数组中的所有元素都是不同的A[i] < A[j]
。
让我们在n元素数组中选择第k个时,表示P(i, j, k, n)
比较第i个和第j个元素的概率。
然后r
与1..n
中的任何一个相同,概率为1/n
。还要注意,所有这些事件都是非交叉的,它们的联合构成了事件的所有空间。
让我们仔细查看r
的每个可能值。
如果r = 1..i-1
,那么i
和j
属于同一部分,如果P(i-r, j-r, k-r, n-r)
和k > r
,他们的比较概率为0
否则。
如果r = i
概率为1
。
如果r = i+1..j-1
概率为0
。
如果r = j
的概率为1
而r = j+1..n
的概率为P(i, j, k, r-1)
k < 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
最后,对于i
(j
和Ps
不同),唯一可能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 <= n
和n
乘法常数是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。发生这种情况的概率是多少?