【问题标题】:Selection i'th smallest number algorithm选择第 i 个最小数算法
【发布时间】:2012-02-24 11:17:52
【问题描述】:

我正在阅读《算法简介》一书,第二版,关于中位数和阶数统计的章节。还有一些关于随机和非随机选择算法的问题。

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

一个。 Randomized_Select 算法很简单。但我无法理解解释它的工作时间的数学。是否有可能在不进行深度数学的情况下以更直观的方式来解释这一点?至于我,我认为它应该适用于 O(nlog n),在最坏的情况下它应该是 O(n^2),就像快速排序一样。在avg randomPartition 中返回靠近数组中间的位置,并且每次调用都将数组分成两个,而下一次递归调用只处理数组的一半。 RandomizedPartition 成本 (p-r+1)

下一个(选择算法)比上一个更难理解:

b.和以前相比有什么不同。平均速度更快吗?

c。该算法由五个步骤组成。在第一个中,我们将数组分成 n/5 个部分,每个部分有 5 个元素(最后一个元素除外)。然后使用插入排序对每个部分进行排序,我们选择每个部分的第三个元素(中位数)。因为我们已经对这些元素进行了排序,所以我们可以确定前两个 = then it。然后我们需要在中位数中选择平均元素。在书中指出,我们递归地调用这些中位数的 Select 算法。我们怎么能做到这一点?在选择算法中,我们使用插入排序,如果我们交换两个中位数,我们需要交换每个中位数的所有四个(或者甚至更多,如果它更深一步)作为“孩子”的元素。或者我们是否创建仅包含先前选择的中位数的新数组,并在其中搜索中位数?如果是,我们如何将它们填充到原始数组中,因为我们之前更改了它们的顺序。

其他步骤非常简单,类似于 random_partition 算法。

【问题讨论】:

  • 在 O(n) 中随机选择运行
  • 我读到了,但我不明白为什么

标签: algorithm sorting


【解决方案1】:

随机选择在 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) )

查看有关如何计算的链接。

对于非随机版本:

你自己说: 在平均随机分区中返回数组中间附近

这正是随机算法起作用的原因,也正是它用于构造确定性算法的原因。理想情况下,您希望确定性地选择枢轴,使其产生良好的分割,但良好分割的最佳值已经是解决方案!所以在每一步他们都想要一个足够好的值,“至少 3/10 的数组低于枢轴,至少 3/10 的数组高于”。为了实现这一点,他们在每一步将原始数组分成 5 个,这也是一个数学选择。

【讨论】:

    【解决方案2】:

    我曾经在维基百科页面上为此创建了一个解释(带图表)...http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_Median_of_Medians_algorithm

    【讨论】:

    • 谢谢!此外,我还没有找到关于我的一个问题的直接答案,但是在分析了 wiki 文章和我在谷歌上搜索的一些文章后,我发现我们确实需要创建新的中位数数组来找到-中位数。在原始数组中没有理由这样做
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2012-01-01
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多