我找到了随机选择在线迭代版的代码:
RANDOMIZED-SELECT(A,p,r,i)
while p < r do
q ← RANDOMIZED-PARTITION(A,p,r)
k ← q – p +1
if i ≤ k then
r ← q
else
p ← q + 1
i ← i – k
return p
如果有人能够向我解释代码的哪一部分,如果i&lt; = k到底,我真的很感激吗?它与递归版有什么不同?
答案 0 :(得分:3)
p
和r
是您要搜索A
元素的i
范围内的左右索引。在第一次分区之后,您可以检查两个分区中每个分区的元素数量。如果左侧分区中有i
个元素或更多元素(由k
指示),则需要在那里继续搜索,在这种情况下,您需要调整范围的右端({{ 1}})等于分区之间的分割点(r
)。如果没有,您要查找的元素将位于右侧分区中的某个位置,因此您需要将范围的左端(q
)设置为拆分右侧的元素({{1 }} - 并且由于你的范围现在已经向右移动,你需要相对于那个调整p
(如果你最初在寻找第8个元素,并且左边分区中有3个元素,你必须现在查找右侧分区中的第5个元素。)
索引的这种调整也必须在递归版本中完成,但它通常发生在递归调用中,因此在第二种情况下它可能看起来像q + 1
。