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

Глава 6. Список и Iterator adTs элемент, чей индекс I списка в индексе I во множестве a. (См. Рисунок 6.1.)

S

0 1 2 я n-1 N-1

(a)

S

0 1 2 я n-1 N-1

(b)

Рисунок 6.1: основанное на множестве внедрение вектора V, который хранит n элементы:

(a) перемена для вставки в индексе i; (b) переходящий вниз для удаления в индексе i.

Выполнение простого основанного на множестве внедрения

Таблица 6.1 показывает продолжительность худшего случая функций вектора с n

элементы поняли посредством множества. Пустые методы, размер, в, и набор ясно бегут в O (1) время, но вставка и функции удаления могут взять намного дольше, чем это. В частности вставка (я, e) бежит вовремя O (n). Действительно, худший случай для этой операции происходит, когда я = 0, так как все существующие n элементы должны быть перемещены вперед. Подобный аргумент применяется к функции, стирают (i), который управляет в O (n) временем,

потому что мы должны переместить обратный n- 1 элемент в худшем случае (я = 0).Действительно,

предположение, что каждый возможный индекс, одинаково вероятно, будет передан как аргумент

эти операции, их средняя продолжительность - O (n), потому что мы должны переместить n/2 элементы в среднем.

Операция Время

размер () O (1)

пустой () O (1)

в (i) O (1)

набор (я, e) O (1) вставка (я, e) O (n)

сотрите (i) O (n)

Таблица 6.1: Работа вектора с n элементами, понятыми множеством. Космическое использование - O (N), где N - размер множества.

Рассмотрение более близко вставляет (я, e) и стирает (i), мы отмечаем, что каждый из них бежит в

время O (n- я + 1), для только тех элементов в индексе i и выше должно быть перемещено

6.1. Векторы 231

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

у этого наблюдения есть интересное последствие для адаптации вектора

ADT к deque ADT данный в Разделе 5.3.1. Если вектор ADT в этом случае осуществлен посредством множества, как описано выше, то функции insertBack и eraseBack deque каждый пробег в O (1) время. Однако функции insertFront и eraseFront deque каждый пробег в O (n) время.

Фактически, с небольшим усилием, мы можем произвести основанное на множестве внедрение вектора ADT, который достигает O (1) время для вставок и удалений в индексе 0, а также вставок и удалений в конце вектора. Достижение этого требует, чтобы мы разочаровались в нашем правлении, что элемент в индексе, я сохранен во множестве в индексе i, однако, поскольку мы должны были бы использовать круглый подход множества как тот, который мы раньше в Разделе 5.2 осуществляли очередь. Мы оставляем детали этого внедрения для упражнения (R-6.17).

6.1.3 Растяжимое внедрение множества

Главная слабость простого внедрения множества для вектора данный ADT

в Разделе 6.1.2 то, что он требует предварительной спецификации фиксированной способности, N, для общего количества элементов, которые могут быть сохранены в векторе. Если фактический ряд элементов, n, вектора будет намного меньше, чем N, то это внедрение потратит впустую пространство. Хуже, если n увеличится мимо N, то это внедрение потерпит крах. К счастью, есть простой способ фиксировать этот главный недостаток.

Давайте обеспечим средство вырастить множество, который хранит элементы vec-скалистой вершины V. Конечно, в C ++ (и большинство других языков программирования) мы не можем фактически вырастить множество A; его способность фиксирована в некотором номере N, поскольку у нас есть al - готовый наблюдаемый. Вместо этого когда overflow происходит, то есть, когда n = N и вставка функции называют, мы выполняем следующие шаги:

1. Ассигнуйте новое множество B способности N

2. Скопируйте [я] к B [я], поскольку я = 0..., N- 1

3. Освободите A и повторно поручите указывать на новое множество B

Эта стратегия замены множества известна как растяжимое множество, поскольку она может

будьте рассмотрены как распространение конца основного множества, чтобы создать место для большего количества элементов. (См. рисунок 6.2.) Интуитивно, эта стратегия во многом как тот из рака-отшельника, который двигается в большую раковину, когда это перерастает свой предыдущий.

Мы даем внедрение вектора ADT использование растяжимого множества в Кодовом Фрагменте 6.2. Чтобы избежать сложностей templated классов, мы приняли нашу более раннюю практику использования определения типа, чтобы определить основной тип элемента, который является интервалом в этом случае. Класс называют ArrayVector. Мы оставляем детали производства полностью универсального templated класса как упражнение (R-6.7).