【问题标题】:Whay is Randomized_Select Algorithm in this way?这种方式的随机选择算法是什么?
【发布时间】:2019-01-26 23:08:55
【问题描述】:

我正在学习“算法导论”教科书第 2 版。在第 9 章(中位数和顺序统计)中,我无法理解为什么我们在 Randomize_Select 算法中需要这个额外的 k。考虑一下书中算法的伪代码。

RANDOMIZED-SELECT(A, p, r, i)
1   if p = r
2       then return A[p]
3   q ← RANDOMIZED-PARTITION(A, p, r)
4   k ← q - p + 1
5   if i = k    ▹ the pivot value is the answer
6       then return A[q]
7   elseif i < k
8       then return RANDOMIZED-SELECT(A, p, q - 1, i)
9   else return RANDOMIZED-SELECT(A, q + 1, r, i - k)

我的问题是为什么我们需要k?我以这种方式实现了算法并且它有效(对于我测试算法的所有示例)。

RANDOMIZED-SELECT(A, p, r, i)
1   if p = r
2       then return A[p]
3   q ← RANDOMIZED-PARTITION(A, p, r)
4   if i = q    ▹ the pivot value is the answer
5       then return A[q]
6   elseif i < q
7       then return RANDOMIZED-SELECT(A, p, q - 1, i)
8   else return RANDOMIZED-SELECT(A, q + 1, r, i)

由于从分区过程返回的 q 是一个索引,其中包含排序后它应该包含的集合中的元素,如果该索引是我们要搜索的,我们就返回它,如果不是,我们在部分上以相同的方式递归包含该元素。为什么需要k? 为什么算法关心每个子集中元素的顺序?为什么我们不关心索引呢?我的更改是否适用于所有情况?

【问题讨论】:

  • 你试过算法了吗?一次执行应该会告诉您盲目更改是一个坏主意。
  • 我试过了,效果很好

标签: algorithm selection


【解决方案1】:

回到RANDOMIZED-SELECTi 的定义。 i 在数组Apr 开始的函数的传递数组范围内。因此,所选值q 应从数组A 中指定的第一个值计算得出。因此,我们应该计算与起始索引 p 相关的 k(传递数组中的位置)。

此外,由于这里的索引是1,所以k应该是q - p + 1

例如,假设A 是一个大小为10 的数组,而p = 5, r = 8。因此,i1 更改为3。因此,我们应该映射58之间的q,应该从1缩放到3;所以,ki 具有相同的比例,而 q 没有!

【讨论】:

  • 非常感谢您的旅游回答。但是“i是传递数组A的元素的位置”是什么意思?
  • @HosamAbdelnaser 它已更新。我的意思是i 在传递数组的范围内,即数组Apr
  • 谢谢。现在我明白你的意思了
  • 是的,也很高兴。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多