【问题标题】:Understanding the select algorithm了解选择算法
【发布时间】:2013-07-21 10:30:10
【问题描述】:

我无法理解分区集合 S 中的元素数量与第 k 个最小数字之间的关系。假设我有这个伪代码:

 Select (k,S)
  if |S|=1 then return a in S
  Choose random a in S
  Let S1,S2,S3 be sets of elements in S (<,=,> to a)
  If |S1|>=k then return Select(k,S1)
  Else if |S1| + |S2| >= k then return a
  Else return Select(k-|S1|-|S2|, S3)

据我所知,为了找到第 k 个最小的元素,我选择了一个枢轴并围绕该枢轴对数字进行排序,使得所有较小的数字都在左侧,所有较大的数字都在枢轴的右侧。然后,如果我想找到第 k 个最小的数字,我将它与枢轴的位置进行比较,如果枢轴的位置大于 k,我会查看枢轴的左侧,如果枢轴的位置小于 k ,我向右看并从那里递归。

但是,在上面的伪代码中,我看不到上面与枢轴和 k 的比较发生在哪里。我的意思是,它不应该与 >= k 而不是 |S1| 进行比较>= k,因为 a 是支点?

在与 k 的比较中,集合中的元素数量如何发挥作用?

【问题讨论】:

  • Let S1,S2,S3 be sets of elements in S (&lt;,=,&gt; to a) a>b 和c&gt;b 意味着c&gt;a数学又来了

标签: algorithm


【解决方案1】:

S1 是小于 a 的数字集合。 S2 是数字 == a 的集合。 S3 是数字 >= a 的集合。这已经包含了很多比较。

现在如果 |S1| >= k,则小于 a 的数字集合超过 k 个元素。因此最小的 k 数已经包含在 S1 中了。

如果不是这样,则它不包含在 S1 中,因此它必须在 S2 或 S3 中。

如果 |S1|+|S2| >= k,那么当然必须在 S1 或 S2 中。因为它不在 S1 中,所以它必须在 S2 中。由于 S2 = {a},所以 k 最小的数是 a。

如果都不是这种情况,那么它必须在 S3 中。因此,搜索可以被限制在 S3。由于 S1 和 S2 中包含的数字在 S3 中缺失,并且由于它们小于 S3 中的所有数字,这意味着我们必须搜索 k-|S1|-|S2| S3 中的最小数字。

【讨论】:

  • 啊,我现在明白了。很好的答案和解释。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2010-10-05
  • 2017-02-11
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多