【发布时间】: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? 为什么算法关心每个子集中元素的顺序?为什么我们不关心索引呢?我的更改是否适用于所有情况?
【问题讨论】:
-
你试过算法了吗?一次执行应该会告诉您盲目更改是一个坏主意。
-
我试过了,效果很好