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

6.3. Последовательности 257

Продолжительность худшего случая обеих из функций atIndex и indexOf

O (n), где n - размер списка. Хотя это не очень эффективно, мы можем взять утешение в факте, что все другие операции списка ADT бегут вовремя O (1). Естественный альтернативный подход должен был бы осуществить последовательность ADT использование множества. Хотя мы могли теперь обеспечить очень эффективные внедрения atIndex и indexOf, вставки и операций по удалению списка, ADT теперь потребует O (n) время. Таким образом никакое решение не прекрасно при всех обстоятельствах. Мы исследуем эту альтернативу в следующей секции.

6.3.3 Осуществление последовательности со множеством

Предположим, что мы хотим осуществить последовательность S, храня каждый элемент e S в клетке [я] множества A. Мы можем определить объект положения p, чтобы держать индекс i и ссылку, чтобы выстроить A как членские переменные. Мы можем тогда осуществить элемент функции (p), просто возвратив ссылку на [меня]. Главный недостаток с этим AP - proach, однако, состоит в том, что у клеток в A нет способа сослаться на их соответствующие положения. Например, после выполнения insertFront операции, элементы были перемещены к новым положениям, но у нас нет способа сообщить существованию - положения луга для S, который изменили связанные положения их элементов. (Помните, что положения в последовательности определены относительно их соседних положений, не их разрядов.) Следовательно, если мы собираемся осуществить общую последовательность со множеством, мы должны найти другой подход.

Рассмотрите дополнительное решение, в котором, вместо того, чтобы хранить элементы S во множестве A, мы храним указатель на новый вид объекта положения в каждой клетке A. Каждое новое положение возражает, что p хранит пару, состоящую из индекса i и элемента e связанный с p. Мы можем легко просмотреть через множество, чтобы обновить стоимость меня, связанную с каждым положением, разряд которого изменяется как результат вставки или удаления. Пример показывают в рисунке 6.7, где новый элемент, содержащий BWI, вставлен в индексе 1 существующей последовательности. После вставки элементы PVD и SFO перемещены вправо, таким образом, мы увеличиваем стоимость индекса, связанную с их парами элемента индекса.

0 JFK 1 PVD 2 SFO 0 JFK 1 BWI 2 PVD 3 SFO

A A

0 1 2 3 N-1 0 1 2 3 N-1

Рисунок 6.7: основанное на множестве внедрение последовательности ADT.

258

Глава 6. Список и Iterator adTs

В этом основанном на множестве внедрении последовательности, функции insertFront, вставка, и стирают, берут O (n) время, потому что мы должны переместить объекты положения создать место для нового положения или заполнить отверстие, созданное удалением старого положения (так же, как во вставке и удалить функции, основанные на разряде). Все другие основанные на положении функции берут O (1) время.

Обратите внимание на то, что мы можем использовать множество круглым способом, как мы сделали для осуществления очереди (см. Раздел 5.2.4). С небольшой работой мы можем тогда выполнить вставку функций - Фронт в O (1) время. Обратите внимание на то, что функции вставляют и стирают, все еще берут O (n) время. Теперь, худший случай происходит, когда у элемента, который будет вставлен или удален, есть разрядn/2 ⌋.

Таблица 6.2 сравнивает продолжительность внедрений общей последовательности ADT посредством круглого множества и вдвойне связанного списка.

Операционный размер, пустые atIndex, indexOf начинают, конец *p, ++ p,-p insertFront, insertBack вставка, стирают

Круглое множество

O (1) O (1) O (1) O (1) O (1) O (n)

Список O (1) O (n) O (1) O (1) O (1) O (1)

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

Суммируя этот стол, мы видим, что основанное на множестве внедрение превосходит внедрение связанного списка на основанных на разряде операциях по доступу, atIndex и indexOf. Это равно в работе внедрению связанного списка на всех других операциях по доступу. Относительно операций по обновлению связанный список implementa-tion бьет основанное на множестве внедрение в основанных на положении операциях по обновлению, вставке, и стереть. Для операций по обновлению insertFront и insertBack, у двух imple-процессов мышления есть сопоставимая работа.

Рассматривая космическое использование, обратите внимание на то, что множество требует O (N) пространство, где N - размер множества (если мы не используем растяжимое множество), в то время как вдвойне связанный список использует O (n) пространство, где n - ряд элементов в последовательности. Так как n меньше чем или равен N, это подразумевает, что асимптотическое космическое использование внедрения связанного списка превосходит использование множества фиксированного размера, хотя есть маленький постоянный множитель наверху, который больше для связанных списков, так как для множеств не нужны связи, чтобы поддержать заказ их камер.