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

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

Рисунок 9.9: Пример списка пропуска, хранящего 10 записей. Для простоты мы показываем только ключи записей.

Интуитивно, списки настроены так, чтобы Si+1 содержал более или менее любой вход в Сайе. Как видно в деталях метода вставки, записи в Si+1 выбраны наугад из записей в Сайе, выбрав каждый вход от Сайа, чтобы также быть в Si+1 с вероятностью 1/2. Таким образом, в сущности, мы «flip монета» для каждого входа в Сайе и месте, что вход в Si+1, если монета подходит «головы». Таким образом мы ожидаем, что S1 будет иметь о n/2 записях, S2, чтобы иметь о n/4 записях, и, в целом, Сайе, чтобы иметь о n/2i записях. Другими словами, мы ожидаем, что высота h S будет о регистрации n. Сокращение вдвое числа записей от одного списка до следующего не проведено в жизнь, поскольку явная собственность пропуска перечисляет, как бы то ни было. Вместо этого рандомизация используется.

Используя абстракцию положения, используемую для списков и деревьев, мы рассматриваем список пропуска как двумерную коллекцию положений, устроенных горизонтально на уровни и ver-tically в башни. Каждый уровень - список, Сай и каждая башня содержат положения, хранящие тот же самый вход через последовательные списки. Положения в списке пропуска могут быть пересечены, используя следующие операции:

после (p): Возвратите положение после p на том же самом уровне.

прежде (p): Возвратите положение, предшествующее p на том же самом уровне.

ниже (p): Возвратите положение ниже p в той же самой башне.

выше (p): Возвратите положение выше p в той же самой башне.

Мы традиционно предполагаем, что вышеупомянутые операции возвращают пустое положение, если положение, которое требуют, не существует. Не вдаваясь в подробности, мы отмечаем, что можем легко осуществить список пропуска посредством связанной структуры, таким образом, что вышеупомянутое пересечение функционирует, каждый берет O (1) время учитывая положение p списка пропуска. Такая связанная структура - по существу коллекция h, вдвойне связал списки, выровненные в башнях, которые также вдвойне связаны списки.

404

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

9.4.1 Поиск и операции по обновлению в списке пропуска

Структура списка пропуска допускает простые алгоритмы поиска и обновления карты.Действительно,

все алгоритмы поиска и обновления списка пропуска основаны на изящной функции SkipSearch, которая берет ключ k и считает положение p входа e в списке S0 таким образом что

у e есть самый большой ключ (который является возможно- ¥), меньше чем или равный k.

Поиск в списке пропуска

Предположим, что нам дают ключ поиска k. Мы начинаем функцию SkipSearch, устанавливая

переменная положения p к самому верхнему, левому положению в списке S пропуска, названном положением начала S. Таким образом, положение начала - положение Sh, хранящего специальное предложение

вход с ключом- ¥. Мы тогда выполняем следующие шаги (см. рисунок 9.10), где

ключ (p) обозначает ключ входа в положении p:

1. Если S.below (p) пустой, то поиск заканчивается - мы в основании и

определили местонахождение самого большого входа в S с ключом, меньше чем или равным ключу поиска k. Иначе, мы опускаемся к следующему более низкому уровню в существующей башне

устанавливая p¬ S.below (p).

2. Начиная в положении p, мы продвигаем p, пока это не в самом правом положении

на текущем уровне, таким образом, что ключ (p)£ k. Мы называем это просмотром передовой шаг.

Обратите внимание на то, что такое положение всегда существует, так как каждый уровень содержит ключи

+ ¥ и- ¥. Фактически, после того, как мы выполняем просмотр вперед для этого уровня, p

может остаться, где это началось. В любом случае мы тогда повторяем предыдущий шаг.

Рисунок 9.10: Пример поиска в списке пропуска. Положения, которые посещают, ища ключевые 50, подсвечены синим.

Мы даем псевдокодовое описание алгоритма поиска списка пропуска, SkipSearch, в Кодовом Фрагменте 9.21. Учитывая эту функцию, теперь легко осуществить op-

eration находят (k) - мы просто выполняем p ¬ SkipSearch(k) и проверяем действительно ли

ключ (p) = k. Если эти два ключа равны, мы возвращаем p; иначе, мы возвращаем пустой указатель.