Вы не ошибетесь - объяснения для двух немного разных структур данных, которые совпадают только тогда, когда | U | квадратная степень двух. На высоком уровне мы пытаемся разделить ключ k на две половины, каждая с примерно √ | U | возможности. Первый метод достигает этой цели напрямую; второе - это приближение, которое работает быстрее на аппаратном оборудовании (при условии, что | U | - это степень двойки, наихудший случай - когда | U | не является квадратным, а первая половина имеет в два раза больше возможностей, чем вторая). Выберите один метод и придерживайтесь его.
Вот пример FindSuccessor (3, S). Для простоты я собираюсь выделить рекурсию на трех элементах.
Дерево выглядит как
min=0| aux
max=7|------->min=0|
/ | \ max=2|
/ | \ /|\
/ | \ 0 1 2
/ | \
v v v
min=0| min=3| min=6|
max=1| max=4| max=7|
/| /| /|
0 1 3 4 6 7
В корне мы разделяем 3 = (1, 0) и проверяем, имеет ли 1-й (средний) ребенок максимум> 3. Это происходит, поэтому мы спускаемся туда и используем грубую силу для вычисления ответа, 4. (Из Конечно, если бы у дерева было больше двух уровней, мы бы искали рекурсивно.)
Более интересный случай, когда S = {0, 1, 3, 6, 7}.
min=0| aux
max=7|------->min=0|
/ | \ max=2|
/ | \ /|\
/ | \ 0 1 2
/ | \
v v v
min=0| min=3| min=6|
max=1| max=3| max=7|
/| / /|
0 1 3 6 7
Здесь мы исследуем 1-е поддерево корня {3} и находим, что его максимум не больше 3. Мы находим преемника 1 в структуре данных aux, равной 2, и возвращаем мин. 2-е поддерево, которое равно 6.