随机选择的迭代版本有什么作用?

时间:2016-09-24 17:45:33

标签: algorithm

我找到了随机选择在线迭代版的代码:

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到底,我真的很感激吗?它与递归版有什么不同?

1 个答案:

答案 0 :(得分:3)

pr是您要搜索A元素的i范围内的左右索引。在第一次分区之后,您可以检查两个分区中每个分区的元素数量。如果左侧分区中有i个元素或更多元素(由k指示),则需要在那里继续搜索,在这种情况下,您需要调整范围的右端({{ 1}})等于分区之间的分割点(r)。如果没有,您要查找的元素将位于右侧分区中的某个位置,因此您需要将范围的左端(q)设置为拆分右侧的元素({{1 }} - 并且由于你的范围现在已经向右移动,你需要相对于那个调整p(如果你最初在寻找第8个元素,并且左边分区中有3个元素,你必须现在查找右侧分区中的第5个元素。)

索引的这种调整也必须在递归版本中完成,但它通常发生在递归调用中,因此在第二种情况下它可能看起来像q + 1