选择我是最小数字算法

时间:2012-02-24 11:17:53

标签: algorithm sorting

我正在阅读“算法入门”一书,第二版,关于中位数和秩序统计的章节。我有一些关于随机和非随机选择算法的问题。

问题: 给定一个无序的整数数组,找到数组中的最小元素

一个。 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_pa​​rtition算法。

2 个答案:

答案 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的数组的成本
  • L中的查询成本或查找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)