Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

9.4. Пропустите списки 405

Алгоритм SkipSearch (k):

Вход: ключ поиска k Продукция: Положение p в нижнем списке S0, таким образом, что у входа в p есть самое большое

ключ, меньше чем или равный k

p¬s

в то время как ниже (p) = пустой указатель делают

p¬ ниже (p) 

в то время как k³ ключ (после (p)) делают

p¬ после (p) Просматривают вперед

возвратите p.

Кодовый Фрагмент 9.21: Поиск в списке S пропуска. Переменная s занимает позицию начала S.

Как это оказывается, ожидаемая продолжительность алгоритма, SkipSearch в списке пропуска с n записями - O (регистрируют n). Мы откладываем оправдание этого факта, однако, пока мы не обсудим внедрение функций обновления для списков пропуска.

Вставка в списке пропуска

Алгоритм вставки для пропуска перечисляет рандомизацию использования, чтобы решить высоту башни для нового входа. Мы начинаем вставку нового входа (k, v), выполняя SkipSearch (k) операция. Это дает нам положение p входа нижнего уровня с самым большим ключом, меньше чем или равным k (обратите внимание на то, что p может держать специальный вход

с ключом- ¥). Мы тогда вставляем (k, v) немедленно после положения p. После вставки

новый вход на нижнем уровне, мы «flip» монета. Если flip подходит хвосты, то

мы останавливаемся здесь. Еще (flip подходит головы), мы возвращаемся к предыдущему (затем выше) уровень и вставка (k, v) на этом уровне в соответствующем положении. Мы снова flip монета; если это подходит головы, мы идем в следующий более высокий уровень и повторение. Таким образом мы продолжаем вставлять новый вход (k, v) в списках, пока мы наконец не получаем flip, который подходит хвосты. Мы соединяем все ссылки на новый вход (k, v) созданный в этом процессе, чтобы создать башню для нового входа. Монета flip может быть моделирована с C ++ встроенный, псевдогенератор случайных чисел, проверив, является ли случайное целое число даже или странный.

Мы даем алгоритм вставки для списка S пропуска в Кодовом Фрагменте 9.22, и мы иллюстрируем его в рисунке 9.11. Алгоритм использует функцию insertAfterAbove (p, q, (k, v)), который вставляет положение, хранящее вход (k, v) после положения p (на том же самом уровне как p) и выше положения q, возвращая положение r из нового входа (и начинаясь - ternal ссылки так, чтобы после, прежде, выше, и ниже функций работали правильно на p, q, и r). Ожидаемая продолжительность алгоритма вставки в списке пропуска с n записями - O (зарегистрируйте n), который мы показываем в Разделе 9.4.2.

406 Глава 9. Хеш-таблицы, карты и списки пропуска

Алгоритм SkipInsert (k, v):

Вход: Ключ k и стоимость v

Продукция: Самое верхнее положение входа вставлено в список пропуска

p ¬ SkipSearch(k)

q¬ пустой указатель e¬ (k, v) я¬-1

повториться

я¬ i+1

если я³ h тогда

h¬ h+1 Добавляют новый уровень к списку пропускаt¬ после (s) s¬ insertAfterAbove (пустой указатель, s, (-¥, пустой указатель)) insertAfterAbove (s, t, (+ ¥, пустой указатель))

в то время как выше (p) = пустой указатель делают

p¬ прежде (p) Просматривают назад

p¬ выше (p) Подпрыгивают к более высокому уровню, q ¬ insertAfterAbove(p, q, e)добавляет положение к башне нового входа

до coinFlip () = хвосты

n¬ n+1

возвратите q

Кодовый Фрагмент 9.22: Вставка в списке пропуска. Метод coinFlip () возвращает «головы» или «хвосты», каждого с вероятностью 1/2. Переменные n, h, и s держат число записей, высоты и узла начала списка пропуска.

Рисунок 9.11: Вставка входа с ключевыми 42 в список пропуска рисунка 9.9. Мы предполагаем, что случайная «монета flips» для нового входа подошла, возглавляет три раза подряд, сопровождаемый хвостами. Положения, которые посещают, подсвечены синим. Положения, вставленные, чтобы держать новый вход, оттянуты с толстыми линиями, и положения, предшествующие им, являются flagged.