我正在阅读“算法入门”一书,第二版,关于中位数和秩序统计的章节。我有一些关于随机和非随机选择算法的问题。
问题: 给定一个无序的整数数组,找到数组中的最小元素
一个。 Randomized_Select算法很简单。但我无法理解解释它的工作时间的数学。是否有可能以更直观的方式解释没有进行深入的数学运算?至于我,我认为它应该适用于O(nlog n),在最坏的情况下它应该是O(n ^ 2),就像快速排序一样。在avg randomizedPartition返回数组的中间附近,并且数组每次调用分为两个,而下一个递归调用进程只有数组的一半。 RandomizedPartition成本(p-r + 1)< = n,因此我们有O(n * log n)。在最坏的情况下,它将每次选择数组中的最大元素,并将数组分成两部分 - 每一步(n-1)和(0)。那是O(n ^ 2)
下一个(选择算法)比之前更难以理解:
湾与以前相比有什么不同。它的速度更快吗?
℃。该算法包括五个步骤。在第一个中,我们将数组分成n / 5个部分,每个部分有5个元素(在最后一个元素旁边)。然后使用插入排序对每个部分进行排序,并选择每个部分的第3个元素(中位数)。因为我们已经对这些元素进行了排序,所以我们可以确定前两个< =这个pivot元素,后两个是> =然后它。然后我们需要在medians中选择avg元素。在书中指出,我们递归调用这些中位数的Select算法。我们怎么做到这一点?在select算法中,我们使用插入排序,如果我们交换两个中位数,我们需要交换所有四个(如果是更深的步骤,甚至更多)元素,每个中位数是“子”。或者我们是否创建仅包含先前选择的中位数的新数组,并在其中搜索中位数?如果是,我们如何在原始数组中填充它们,因为我们之前更改了它们的顺序。
其他步骤非常简单,看起来像randomized_partition算法。
答案 0 :(得分:3)
O(n)中的随机选择运行。看看this analysis。
Algorithm :
Randomly choose an element
split the set in "lower than" set L and "bigger than" set B
if the size of "lower than" is j-1 we found it
if the size is bigger, then Lookup in L
or lookup in B
总费用是:
的总和编辑:我试图重组我的帖子
您可以注意到:
n - rank(xj)
1 <= rank(xi) <= n
所以1 <= n - rank(xj) <= n
xj
的随机性直接影响元素数量的随机性
更大xj
(并且小于xj
)如果xj是所选元素,那么您知道成本为O(n) + cost(n - rank(xj))
。我们打电话给rank(xj) = rj
。
为了给出一个好的估计,我们需要采用总成本的预期值,即
T(n) = E(cost) = sum {each possible xj}p(xj)(O(n) + T(n - rank(xj)))
xj
是随机的。在此之后它是纯粹的数学。
我们获得:
T(n) = 1/n *( O(n) + sum {all possible values of rj when we continue}(O(n) + T(n - rj))) )
T(n) = 1/n *( O(n) + sum {1 < rj < n, rj != i}(O(n) + T(n - rj))) )
您可以在这里更改变量vj = n - rj
T(n) = 1/n *( O(n) + sum { 0 <= vj <= n - 1, vj!= n-i}(O(n) + T(vj) ))
我们将O(n)置于总和之外,获得一个因子
T(n) = 1/n *( O(n) + O(n^2) + sum {1 <= vj <= n -1, vj!= n-i}( T(vj) ))
我们将O(n)和O(n ^ 2)放在外面,松散因子
T(n) = O(1) + O(n) + 1/n *( sum { 0 <= vj <= n -1, vj!= n-i} T(vj) )
检查有关如何计算的链接。
对于非随机版本:
你说自己: 在avg randomizedPartition中返回靠近数组的中间 。
这正是随机算法工作的原因,这正是它用于构造确定性算法的原因。理想情况下,您希望确定性地选择枢轴,以便产生良好的分割,但良好分割的最佳值已经是解决方案!因此,在每一步中,他们都需要一个足够好的值,“至少在枢轴下方3/10的数组和至少3/10的数组”。为了达到这个目的,他们在每一步将原始数组分成5个,这也是一个数学选择。
答案 1 :(得分:1)